1. 背景
雖說以前學(xué)習(xí)計算機網(wǎng)絡(luò)的時候晶通,學(xué)習(xí)過了璃氢,但為了更好地學(xué)習(xí)一些物聯(lián)網(wǎng)協(xié)議(MQTT),需要重新復(fù)習(xí)一下狮辽。
2. OSI 7層模型
- OSI(Open System Interconnect ---開放式系統(tǒng)互聯(lián))一也,是 ISO(國際標(biāo)準(zhǔn)化組織)組織在1985年研究的 網(wǎng)絡(luò)互連模型,旨在擬定一個標(biāo)準(zhǔn)來規(guī)范網(wǎng)絡(luò)連接喉脖。
- OSI 7層:分別為 物理層椰苟、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層树叽、傳輸層舆蝴、會話層、表示層题诵、應(yīng)用層。
- 使用原則
1> 數(shù)據(jù)發(fā)送時從上至下封裝性锭,收到數(shù)據(jù)包后從下至上解包;
2> 數(shù)據(jù)只能逐層傳輸草冈,不能跳層瓮增;
3> 分層思想:每一層可以使用下層提供的服務(wù)接口(并不關(guān)心下層如何實現(xiàn)),并向上層提供服務(wù)哩俭。
4>
3. TCP/IP 4層模型
TCP/IP 參考了OSI模型绷跑,將 最上的3層(應(yīng)用層凡资、表示層、會話層) 視為 應(yīng)用層讳苦, 由 將 最下的2層(數(shù)據(jù)鏈路層带膜、物理層)視為 數(shù)據(jù)鏈路層。所以TCP/IP 簡化為 4層模型鸳谜。
4. TCP 和 UDP 協(xié)議
TCP(Transmission Control Protocol 式廷,傳輸控制協(xié)議) 與 UDP(User Datagram Protocol ,用戶數(shù)據(jù)報協(xié)議) 是傳輸層中的兩種協(xié)議蝗肪。
我們平時 網(wǎng)絡(luò)傳輸文件蠕趁、視頻會議等 都要通過這兩種協(xié)議進行數(shù)據(jù)傳輸。
正如上圖介紹的俺陋,TCP 是面向連接的、可靠的诱咏、基于字節(jié)流程 的協(xié)議缴挖,那么TCP 是如何 建立連接 與 斷開連接 呢?
4.1 三次握手
說明:
在傳輸數(shù)據(jù)前苟鸯,兩臺主機需要通過三次會話建立連接棚点,這個過程我們稱為三次握手。
第一次握手:客戶端向服務(wù)端請求建立連接乙濒,
SYN=1(建立連接)卵蛉,
seq=x(序列號)么库,
客戶端進入SYN_SENT狀態(tài)。
第二次握手:服務(wù)端向客戶端返回確認(rèn)并請求建立連接葡缰,
SYN=1(建立連接)忱反,
ACK=1 (已收到),
ack=x+1(確認(rèn)號為收到的序列號加一)温算,
seq=y(序列號),
服務(wù)端進入SYN_RCVD狀態(tài)茄茁。
第三次握手:客戶端向服務(wù)端發(fā)送確認(rèn)報文,
ACK=1 (已收到)巩割,
ack=y+1(確認(rèn)號為收到的序列號加一),
seq=x+1(序列號)愈犹,
三次握手完成以后闻丑,2個主機之間,就可以傳輸數(shù)據(jù)啦~
4.2 三次握手-必要性
- 常見回答:因為三次握手才能保證雙方具有接收和發(fā)送的能力梆掸。
第一次握手SYN---服務(wù)端得知-客戶端有發(fā)送的能力酸钦;
第二次握手SYN、ACK---客戶端得知-服務(wù)端有接收與發(fā)送的能力卑硫;
第三次握手ACK---服務(wù)端得知-客戶端有接收的能力。 -
深入剖析-三次握手的必要性:
1> 三次握手才可以阻止重復(fù)歷史連接的初始化(主要原因)
2> 三次握手才可以同步雙方的初始序列號
3> 三次握手才可以避免資源浪費入挣。
避免歷史重復(fù)連接
4.3 四次揮手
說明:
第一次揮手:客戶端向服務(wù)端請求斷開連接径筏,
FIN=1(斷開連接),
seq=u(序列號)滋恬,
客戶端進入FIN_WAIT_1狀態(tài)。
第二次揮手:服務(wù)端向客戶端返回確認(rèn)報文带斑,
ACK=1 (已收到)勋拟,
ack=u+1(確認(rèn)號為收到的序列號加一),
seq=v(序列號)挂滓,
服務(wù)端進入CLOSE_WAIT狀態(tài)啸胧,客戶端進入FIN_WAIT_2狀態(tài)。
第三次揮手:服務(wù)端完成數(shù)據(jù)傳輸后吓揪,向客戶端發(fā)送斷開連接請求所计,
FIN=1(斷開連接),
ACK=1 (已收到)叭首,
ack=u+1(確認(rèn)號為收到的序列號加一)踪栋,
seq=w(序列號),
服務(wù)端進入LAST_ACK狀態(tài)眷唉。
第四次揮手:客戶端向服務(wù)端返回確認(rèn)報文囤官,
ACK=1 (已收到),
ack=w+1(確認(rèn)號為收到的序列號加一)党饮,
seq=u+1(序列號),
客戶端進入TIME_WAIT狀態(tài)饲常,服務(wù)端進入CLOSED狀態(tài)贝淤。
特殊說明:客戶端處于TIME_WAIT狀態(tài)時熊楼,TCP連接還未釋放掉,等待2個MSL(Maximum Segment Lifetime鲫骗,最大段生命周期)的時長后,客戶端進入CLOSE狀態(tài)枕磁。
4.4 思考
四次揮手結(jié)束后术吝,客戶端為什么沒有立刻關(guān)閉呢?
答:為了確保第四次揮手 ACK到達(dá)服務(wù)端沦寂。
場景1:
第四次揮手淘衙,客戶端發(fā)送的ACK確認(rèn)報文丟失了,未能到達(dá)服務(wù)端彤守。
因為服務(wù)端在規(guī)定時間內(nèi)未收到最后的確認(rèn)消息具垫,會重新進行第三次揮手請求斷開連接,客戶端重新發(fā)送確認(rèn)消息筝蚕,如下圖所示:
場景2:
如果超過2個MSL,客戶端未重新收到斷開連接的請求燎含,說明四次揮手順利完成,可以斷開連接了绘梦。
客戶端從TIME_WAIT狀態(tài) 進入 CLOSED狀態(tài)。
5. 文章參考
1. 三次握手钝诚,四次揮手榄棵,原來TCP這么有禮貌!;
2. TCP面試題:為什么是三次握手疹鳄?不是兩次、四次垫蛆? ;