傳輸層協議
TCP
傳輸控制協議(Transmission Control Protocol)
可靠 慢 面向連接的協議
保證可靠的四種方法:
- 建立連接(三次握手)
- PC向S發送一個SYN消息,攜帶一個序列號seq假設爲a。
- S有沒有接收到PC發來的消息PC並不知道,所以S接收到SYN消息之後應該恢復一個確認消息ACK,攜帶一個確認號ack爲a+1,讓PC知道S已經收到seq爲a的SYN消息了。
如果只是到這裏就結束了,證明PC發送的消息S可以接收到,這點PC和S都知道,但是S並不知道PC有沒有收到自己發過去的ACK消息,所以S決定也讓PC回個消息確認一下PC收到了沒。
所以S在發送ACK消息給PC確認的時候,順便也發了個SYN消息,攜帶一個seq爲b。 - PC收到了S發來的ACK和SYN消息之後,回覆一個ACK消息,攜帶ack爲b+1,seq爲a+1。
根據上述過程,我們很容易可以發現ack的作用,就是確認上一個報文,同時也是下一個報文的序列號。
- 丟包重傳
- PC和S通信過程中,PC一直給S發包,順序號依次是a+2,a+3,a+4,但是很不幸的事發生了——seq爲a+4這個包丟了!
- 這個時候,如果S不告訴PC,PC就永遠不知道丟了個包,也就無法保證數據的可靠性,聰明的S想到個辦法,就是給PC發送確認信息。
- S會給PC發送確認信息,攜帶的ack的值爲收到的最大seq+1(也就是a+4),PC就會重新發送seq爲a+4的包,從而保證了數據的可靠性。
-
窗口大小(滑動窗口)
有個大佬說的特別好,鏈接:link -
斷開連接(四次分手)
原理和建立連接的三次握手差不多,唯一的區別就是S在回覆PC的時候,ACK和FIN會分成兩個報文發送。
UDP
用戶數據報協議(User Datagram Protocol)
不可靠 快 無連接的協議
UDP頭部:
0-15 | 16-31 |
---|---|
源端口 | 目的端口 |
長度 | 校驗和 |
長度:UDP長度+數據長度
沒有確認機制
本人也是小白菜,如有錯誤請指出!謝謝大佬!!最後,圖是我徒手畫的!非常簡陋很抱歉!