青海營銷網(wǎng)站建設公司網(wǎng)站外鏈的優(yōu)化方法
目錄
三次握手:
兩次握手
丟包問題與亂序問題
四次揮手
為什么客戶端需要等待超時時間?
TCP報文中含有SYN、ACK、FIN等標識,把這些標識設置1就是開啟這些標識,設置為0就是關(guān)掉這些標識
三次握手:
- 在客戶端發(fā)送tcp報文時,會開啟SYN(同步)標識符,而只開啟SYN標識符是不夠的,還有要有一個sequence序號(初始序號),因為應用程序中可能會連續(xù)發(fā)送多個序號給服務器,服務器根據(jù)該序號來判斷哪些是累贅不需要的信息。
- 服務器也會生成自己的序號,服務端通過接收到的SYN+ACK
- 客戶端和服務器都會有自己的初始序號,服務器向客戶端發(fā)送確認號,該確認號為客戶端的序列號+1得到的,客戶端只需要接收到服務器發(fā)送到的確認號后-1就能確認是不是自己的報文,同時客戶端也會開啟自己的ACK,然后發(fā)送給服務端,服務端接收,即握手成功。
- 服務器不會保存自己的序號,通過服務器的ip和端口號等私有信息進行算的運算得到序號
兩次握手
- 第一次握手,客戶端向服務端發(fā)送請求的SYN 包
- 因為某些原因,SYN未能到達服務器,滯留在某個網(wǎng)絡節(jié)點中
- 此時客戶端重新發(fā)送SYN包,服務器接收到SYN
- 但之前未發(fā)送成功的SYN包也成功讓服務器收到
- 此時,客戶端那邊認為只有一個鏈接,而服務器這邊認為是兩個鏈接
- 造成了狀態(tài)不一致,因此三次握手本質(zhì)解決了網(wǎng)絡信道不可靠的問題
丟包問題與亂序問題
- tcp協(xié)議為每一個鏈接建立了發(fā)送緩沖區(qū)
- 從建立鏈接后 的第一個字節(jié)的序列號為0,后面每一個字節(jié)的序列號增加1
- 發(fā)送數(shù)據(jù)時,從發(fā)送緩沖區(qū)取一部分數(shù)據(jù)組成發(fā)送報文?
- 在其tcp協(xié)議中會附帶序列號和長度
- 接收端收到數(shù)據(jù)后需要恢復確認報文
- 發(fā)送端能夠一次發(fā)送多包數(shù)據(jù),接收端只需要恢復一次ACK
四次揮手
客戶端和服務端都能主動發(fā)起請求
- 假設客戶端主動發(fā)起連接關(guān)閉請求
- 客戶端向服務端發(fā)送FIN包,同時客戶端進入終止等待1狀態(tài)(第一次揮手)
- 服務端收到FIN包并發(fā)送ACK包,表示服務端進入關(guān)閉等待狀態(tài)
- 客戶端進入終止等待2狀態(tài)(第二次揮手)
- 此時,服務端還可以發(fā)送數(shù)據(jù),客戶端能夠接收數(shù)據(jù)
- 等服務端發(fā)送完數(shù)據(jù)后,向客戶端發(fā)送FIN包,客戶端收到后回復ACK包(第三次揮手)
- 客戶端進入超時等待狀態(tài),經(jīng)過超時時間后關(guān)閉連接,服務端收到ACK包后立即關(guān)閉連接(第四次揮手)
為什么客戶端需要等待超時時間?
為了保證對端已收到ACK包,因為假設客戶端發(fā)送完ACK包后就釋放了連接,一旦ACK在網(wǎng)絡中丟失,服務端將會一直停留在最后的確認階段,而如果客戶端發(fā)送完ACK包后停留一段時間,此時如果服務端沒有收到ACK包就會重發(fā)FIN包,客戶端就會響應FIN包重發(fā)ACK包,還會重新刷新超時時間