一、TCP和UDP有什麼差別?TCP為什麼三次握手而不是兩次?

- TCP是面向連接配接的服務,而UDP是無連接配接的,即發送資料之前不需要建立連接配接
- TCP提供可靠傳遞服務,無差錯,不丢失,不重複,按序到達,而UDP提供盡力而為傳遞服務,不保證可靠傳遞
- TCP面向位元組流,而UDP面向封包
- TCP具有擁塞控制,力求使每一條TCP連接配接公平的享用網絡資源。UDP沒有擁塞控制,網絡出現擁塞的時候不會使源主機的發送速率降低(對實時應用很有用)
- TCP連接配接隻能是點到點的,而UDP支援一對一,一對多,多對一和多對多的互動通信
- TCP首部開銷20位元組,UDP首部開銷8位元組
- TCP的邏輯通信信道是全雙工的可靠信道,而UDP是不可靠信道
用戶端–發送帶有 SYN 标志的資料包–一次握手–服務端
服務端–發送帶有 SYN/ACK 标志的資料包–二次握手–用戶端
用戶端–發送帶有帶有 ACK 标志的資料包–三次握手–服務端
三次握手的目的是建立可靠的通信信道,說到通訊,簡單來說就是資料的發送與接收,而三次握手最主要的目的就是雙方确認自己與對方的發送與接收是正常的。
第一次握手:Client 什麼都不能确認;Server 确認了對方發送正常,自己接收正常
第二次握手:Client 确認了:自己發送、接收正常,對方發送、接收正常;Server 确認了:對方發送正常,自己接收正常
第三次握手:Client 确認了:自己發送、接收正常,對方發送、接收正常;Server 确認了:自己發送、接收正常,對方發送、接收正常
是以三次握手就能确認雙發收發功能都正常,缺一不可
4次揮手
第一次揮手:主機1(可以使用戶端,也可以是伺服器端),設定Sequence Number和Acknowledgment Number,向主機2發送一個FIN封包段;此時,主機1進入FIN_WAIT_1狀态;這表示主機1沒有資料要發送給主機2了;
第二次揮手:主機2收到了主機1發送的FIN封包段,向主機1回一個ACK封包段,Acknowledgment Number為Sequence Number加1;主機1進入FIN_WAIT_2狀态;主機2告訴主機1,我也沒有資料要發送了,可以進行關閉連接配接了;
第三次揮手:主機2向主機1發送FIN封包段,請求關閉連接配接,同時主機2進入CLOSE_WAIT狀态;
第四次揮手:主機1收到主機2發送的FIN封包段,向主機2發送ACK封包段,然後主機1進入TIME_WAIT狀态;主機2收到主機1的ACK封包段以後,就關閉連接配接;此時,主機1等待2MSL後依然沒有收到回複,則證明Server端已正常關閉,那好,主機1也可以關閉連接配接了。
問題
1.為什麼TIME_WAIT狀态需要經過2MSL(最大封包段生存時間)才能傳回到CLOSE狀态?
雖然按道理,四個封包都發送完畢,我們可以直接進入CLOSE狀态了,但是我們必須假象網絡是不可靠的,有可以最後一個ACK丢失。是以TIME_WAIT狀态就是用來重發可能丢失的ACK封包。
2.client發送完最後一個ack之後,進入time_wait狀态,但是他怎麼知道server有沒有收到這個ack呢?莫非sever也要等待一段時間,如果收到了這個ack就close,如果沒有收到就再發一個fin給client?這麼說server最後也有一個time_wait哦?求解答!
因為網絡原因,主動關閉的一方發送的這個ACK包很可能延遲,進而觸發被動連接配接一方重傳FIN包。極端情況下,這一去一回,就是兩倍的MSL時長。如果主動關閉的一方跳過TIME_WAIT直接進入CLOSED,或者在TIME_WAIT停留的時長不足兩倍的MSL,那麼當被動
關閉的一方早先發出的延遲包到達後,就可能出現類似下面的問題:1.舊的TCP連接配接已經不存在了,系統此時隻能傳回RST包2.新的TCP連接配接被建立起來了,延遲包可能幹擾新的連接配接,這就是為什麼time_wait需要等待2MSL時長的原因。