TCP和UDP
UDP,在傳送數據前不需要先建立連接,遠地的主機在收到UDP報文后也不需要給出任何確認。雖然UDP不提供可靠交付,但是正是因為這樣,省去和很多的開銷,使得它的速度比較快,比如一些對實時性要求較高的服務,就常常使用的是UDP。對應的應用層的協議主要有 DNS,TFTP,DHCP,SNMP,NFS 等。
TCP,提供面向連接的服務,在傳送數據之前必須先建立連接,數據傳送完成后要釋放連接。因此TCP是一種可靠的的運輸服務,但是正因為這樣,不可避免的增加了許多的開銷,比如確認,流量控制等。對應的應用層的協議主要有 SMTP,TELNET,HTTP,FTP 等。
三次握手
第一次握手:主機A發送同步報文段(SYN)請求建立連接。
第二次握手:主機B聽到連接請求,就將該連接放入內核等待隊列當中,並向主機A發送針對SYN的確認ACK,同時主機B也發送自己的請求建立連接(SYN)。
第三次握手:主機A針對主機BSYN的確認應答ACK。
四次揮手
第一次揮手:當主機A發送數據完畢后,發送FIN結束報文段。
第二次揮手:主機B收到FIN報文段后,向主機A發送一個確認序號ACK(為了防止在這段時間內,對方重傳FIN報文段)。
第三次揮手:主機B准備關閉連接,向主機A發送一個FIN結束報文段。
第四次揮手:主機A收到FIN結束報文段后,進入TIME_WAIT狀態。並向主機B發送一個ACK表示連接徹底釋放。
為什么連接的時候是三次握手,關閉的時候卻是四次握手?
TCP是全雙工的,每個方向都要進行單獨關閉。當一方完成數據發送任務后,發送一個FIN報文來終止這一方向的連接,這意味着不再發送數據,但是還可以接收數據,除非對方也發送了FIN報文。假設client端是主動發起方,當server端收到Client端的FIN報文后,知道它不再發送數據過來了。但server端自己還有數據沒發完,不想立即關閉連接,所以只能先回復一個ACK報文,告訴client端,"你發的FIN報文我收到了"。server端等所有的數據都發送完了,然后發一個FIN+ACK報文給client端,client端收到后發送一個ACK報文給server端,server端收到了,然后才真正關閉了連接,故需要四步握手。
四次揮手中的TIME_WAIT狀態存在的理由
理由之一:
A不能保證最后的ACK能達到B, 所以, 還應該觀望一段時間, 護送一段時間。 如果最后的ACK丟失, 那么B顯然收不到, B於是發起了重傳FIN的操作, 此時如果A處於CLOSED的狀態, 就沒辦法給對端發ACK了(實際是發RST), 嗚呼哀哉。 所以A應該等一段時間, 這段時間就是所謂的TIME_WAIT, 比如, 等待一個RTT的時間(實際上, 考慮到如下的理由之二就知道, RTT可能不夠, 用2MSL更靠譜)。
所以, TIME_WAIT存在的理由之一是盡可能護送最后的ACK達到對端。
理由之二:
假設tcp連接是: A(1.2.3.4:8888)------B(6.7.8.9:9999), 這就是一個tcp四元組。 當tcp連接關閉后, 四元組釋放。 后面的新連接可能會重用到這個四元組(有這個可能性), 那么問題就來了: 新四元組和舊四元組完全一致, 他們的網絡包會混亂嗎? 所以, 可以考慮這樣一個機制: 讓舊四元組對應的所有網絡包都消失后(等一段時間), 才允許新四元組建立, 頗有點鎖的味道。 那么這個等一段時間究竟是多久呢? 多久才合適呢? 在前面的文章中, 我們討論過, 采用2MSL比較合適, 我個人認為, 把TIME_WAIT定義為2MSL只是一個通用的經驗方法而已, 無法從理論上百分之百論證。
所以, TIME_WAIT存在的理由之二是新舊四元組互不干擾。
TCP報文頭部
1.源端口和目的端口,各占2個字節,分別寫入源端口和目的端口;
2.序號,占4個字節,TCP連接中傳送的字節流中的每個字節都按順序編號。例如,一段報文的序號字段值是 301 ,而攜帶的數據共有100字段,顯然下一個報文段(如果還有的話)的數據序號應該從401開始;
3.確認號,占4個字節,是期望收到對方下一個報文的第一個數據字節的序號。例如,B收到了A發送過來的報文,其序列號字段是501,而數據長度是200字節,這表明B正確的收到了A發送的到序號700為止的數據。因此,B期望收到A的下一個數據序號是701,於是B在發送給A的確認報文段中把確認號置為701;
4.數據偏移,占4位,它指出TCP報文的數據距離TCP報文段的起始處有多遠;
5.保留,占6位,保留今后使用,但目前應都位0;
6.緊急URG,當URG=1,表明緊急指針字段有效。告訴系統此報文段中有緊急數據;
7.確認ACK,僅當ACK=1時,確認號字段才有效。TCP規定,在連接建立后所有報文的傳輸都必須把ACK置1;
8.推送PSH,當兩個應用進程進行交互式通信時,有時在一端的應用進程希望在鍵入一個命令后立即就能收到對方的響應,這時候就將PSH=1;
9.復位RST,當RST=1,表明TCP連接中出現嚴重差錯,必須釋放連接,然后再重新建立連接;
10.同步SYN,在連接建立時用來同步序號。當SYN=1,ACK=0,表明是連接請求報文,若同意連接,則響應報文中應該使SYN=1,ACK=1;
11.終止FIN,用來釋放連接。當FIN=1,表明此報文的發送方的數據已經發送完畢,並且要求釋放;
12.窗口,占2字節,指的是通知接收方,發送本報文你需要有多大的空間來接受;
13.檢驗和,占2字節,校驗首部和數據這兩部分;
14.緊急指針,占2字節,指出本報文段中的緊急數據的字節數;
15.選項,長度可變,定義一些其他的可選的參數。
TCP如何保證數據可靠性
• 數據包校驗
• 超時重傳機制
• 應答機制
• 對失序數據包重排序
• TCP還能提供流量控制
https://blog.csdn.net/guanghuichenshao/article/details/81916277
https://blog.csdn.net/liuchenxia8/article/details/80428157