一.TCP三次握手和四次揮手,ACK報文的大小
首先連接需要三次握手,釋放連接需要四次揮手
然后看一下連接的具體請求:
【注意】中斷連接端可以是Client端,也可以是Server端。
【注意】 在TIME_WAIT狀態中,如果TCP client端最后一次發送的ACK丟失了,它將重新發送。TIME_WAIT狀態中所需要的時間是依賴於實現方法的。典型的值為30秒、1分鍾和2分鍾。等待之后連接正式關閉,並且所有的資源(包括端口號)都被釋放。
【問題1】為什么連接的時候是三次握手,關閉的時候卻是四次握手?
答:因為當Server端收到Client端的SYN連接請求報文后,可以直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連接時,當Server端收到FIN報文時,很可能並不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,"你發的FIN報文我收到了"。只有等到我Server端所有的報文都發送完了,我才能發送FIN報文,因此不能一起發送。故需要四步握手。
【問題2】為什么TIME_WAIT狀態需要經過2MSL(最大報文段生存時間)才能返回到CLOSE狀態?
答:雖然按道理,四個報文都發送完畢,我們可以直接進入CLOSE狀態了,但是我們必須假象網絡是不可靠的,有可以最后一個ACK丟失。所以TIME_WAIT狀態就是用來重發可能丟失的ACK報文。
二、TCP和UDP的不同之處
TCP:面向連接、傳輸可靠(保證數據正確性,保證數據順序)、用於傳輸大量數據(流模式)、速度慢,建立連接需要開銷較多(時間,系統資源),一般用於文件傳輸、郵件需要精確的操作。
UDP:面向非連接、傳輸不可靠、用於傳輸少量數據(數據包模式)、速度快,一般用於即時通信、在線視頻需要低延遲的操作。
三、TCP如何保證可靠的?
通過順序編號和確認(ACK)來實現的
為准備重傳而首先將該段插入到發送隊列之中,同時啟動時鍾。其后,如果收到了接受端對該段的ACK信息,就將該段從隊列中刪去。如果在時鍾規定的時間內,ACK未返回,那么就從發送隊列中再次送出這個段。TCP在協議中就對數據可靠傳輸做了保障,握手與斷開都需要通訊雙方確認,數據傳輸也需要雙方確認成功,在協議中還規定了:分包、重組、重傳等規則。
四、TCP滑動窗口
滑動窗口協議,該協議允許發送方在停止並等待確認前發送多個數據分組。由於發送方不必每發一個分組就停下來等待確認,因此該協議可以加速數據的傳輸。