对于三次握手的疑问
三次握手的第三次握手發(fā)送ACK能攜帶數(shù)據(jù)嗎?如何攜帶?怎樣體現(xiàn)的呢?
作者:車小胖鏈接:https://www.zhihu.com/question/66407996/answer/242152945
來源:知乎
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
人類先發(fā)明了電話,當(dāng)電話原理成熟了,上世紀(jì)中后葉又出現(xiàn)了TCP/IP,TCP協(xié)議幾乎就是模仿電話原理的,為了更好學(xué)習(xí)TCP,我們要學(xué)習(xí)電話的基本原理。
三次握手的過程
第一次
上海的老王給北京的老張打電話,撥號(hào)碼
010-68886xx8
老王電話機(jī)與電信局之間的電話線,其實(shí)有兩個(gè)信道:信令信道 + 語音信道,
當(dāng)老王拿起電話,撥010-68886xx8,這個(gè)號(hào)碼通過信令信道傳到了電信局,同時(shí)將語音信道(DS0)保留,為了稍后的通信做語音信道預(yù)留。
電信局根據(jù)這個(gè)號(hào)碼做路由查找,找到其上一級(jí)的交換機(jī),通過信令信道將010-68886xx88轉(zhuǎn)發(fā)給上一級(jí)交換機(jī),同時(shí)和上一級(jí)協(xié)商好,預(yù)留一個(gè)DS0語音信道,為了語音傳輸。
這樣一級(jí)級(jí)轉(zhuǎn)接,最終號(hào)碼轉(zhuǎn)接到北京老張的電話機(jī),振鈴,北京電信局與老張電話機(jī)之間預(yù)留一個(gè)DS0語音信道,為了語音傳輸。
第二次
老張拿起電話的那一刻,一個(gè)“Connected”信令順著來時(shí)的信令信道(一跳、一跳)傳輸?shù)嚼贤醯碾娫挋C(jī)。
第三次
老王電話機(jī)通常還會(huì)回復(fù)一個(gè)“ACK”給對(duì)方,以示接到對(duì)方的“Connected”。
語音傳輸
當(dāng)老張拿起電話的那一刻,端到端的語音信道已經(jīng)預(yù)留好了,一般為DS0= 64Kbps,這條端到端信道其實(shí)是由多條 hop-2-hop信道串聯(lián)而成的。
此時(shí)雙方可以自由說話,語音數(shù)據(jù)會(huì)從保留的語音信道流淌到對(duì)方。
從以上的描述來看,信令數(shù)據(jù)、語音數(shù)據(jù)是在自己獨(dú)立的信道里傳輸,大家井水不犯河水,互不干涉。
TCP
TCP模仿電話原理,也有自己的信令數(shù)據(jù)、應(yīng)用層數(shù)據(jù),那哪些是信令數(shù)據(jù)呢?
SYN
ACK
RST
PSH
URG
FIN
依靠這六個(gè)信令狀態(tài)位,與對(duì)方
1)建立連接SYN
2)重置連接RST
3)拆除連接FIN
那什么是應(yīng)用層數(shù)據(jù)呢?就是TCP的服務(wù)對(duì)象,比如Http。
TCP也想使用電話里的雙信道,但TCP所依賴的IP網(wǎng)絡(luò)沒有信道的概念,完全是一個(gè)共享網(wǎng)絡(luò)的模式。
TCP沒有雙信道使用,退而求其次,只要信令數(shù)據(jù)、應(yīng)用數(shù)據(jù)放在獨(dú)立的IP包傳輸?shù)綄?duì)方就好,這就是大家最熟悉的TCP工作模式:
1)三次握手建立連接
2)數(shù)據(jù)傳輸
3)四次握手拆除連接
三次握手最后一個(gè)消息是客戶端發(fā)過來的ACK,如果讓應(yīng)用層數(shù)據(jù)與這個(gè)信令數(shù)據(jù)合二為一,可以減少發(fā)送的IP包的數(shù)目,還可以提高效率,何樂不為呢?
TCP協(xié)議的制定者,為了提高效率,減少IP包的數(shù)目,最大可能地將信令數(shù)據(jù)、應(yīng)用數(shù)據(jù)合二為一,各位同學(xué)通過抓包,可以看到一個(gè)TCP連接,除了第一個(gè)SYN包,每個(gè)TCP報(bào)文都有ACK信令,這就是合二為一的結(jié)果!
第三次握手,是客戶端為了告訴服務(wù)器,我已經(jīng)收到了你發(fā)送的SYNC + ACK報(bào)文,此時(shí)這個(gè)報(bào)文只帶ACK標(biāo)志,SYNC標(biāo)志沒有。
客戶端發(fā)送這個(gè)報(bào)文之后,就進(jìn)入established狀態(tài)了。服務(wù)器收到這個(gè)報(bào)文之后,也進(jìn)入established狀態(tài)。
TCP標(biāo)準(zhǔn)規(guī)定,第三次握手的報(bào)文,可以攜帶數(shù)據(jù)。因?yàn)榇藭r(shí)客戶端已經(jīng)處于established狀態(tài)了呀。
假設(shè)第三次握手的報(bào)文的seq是x+1,
如果有攜帶數(shù)據(jù),下次客戶端發(fā)送的報(bào)文,seq=服務(wù)器發(fā)回的ACK號(hào)。
如果沒有攜帶數(shù)據(jù),那么第三次握手的報(bào)文不消耗seq。下次客戶端發(fā)送的報(bào)文,seq序列號(hào)還是和第三次握手的報(bào)文的seq一樣,為x+1。這是因?yàn)?#xff0c;seq和報(bào)文中的數(shù)據(jù)在整條數(shù)據(jù)流流中的位置是一一對(duì)應(yīng)的。如果報(bào)文沒有攜帶數(shù)據(jù),那么seq當(dāng)然也不會(huì)更新。
轉(zhuǎn)載于:https://www.cnblogs.com/mrwuzs/p/8031161.html
總結(jié)
- 上一篇: MySQL • 源码分析 • 内存分配机
- 下一篇: Employee Bonus --lee