網(wǎng)絡(luò)協(xié)議基礎(chǔ)

TCP是什么?

TCP(Transmission Control Protocol 傳輸控制協(xié)議)是一種面向連接的灭将、可靠的、基于字節(jié)流的傳輸層通信協(xié)議后控。


OSI的七層網(wǎng)絡(luò)模型

我們需要知道TCP工作在網(wǎng)絡(luò)OSI的七層模型中的第四層——Transport層庙曙,IP在第三層——Network層,ARP在第二層——Data Link層浩淘;在第二層上的數(shù)據(jù)捌朴,我們把它叫Frame,在第三層上的數(shù)據(jù)叫Packet张抄,第四層的數(shù)據(jù)叫Segment砂蔽。 同時(shí),我們需要簡(jiǎn)單的知道署惯,數(shù)據(jù)從應(yīng)用層發(fā)下來(lái)左驾,會(huì)在每一層都會(huì)加上頭部信息,進(jìn)行封裝极谊,然后再發(fā)送到數(shù)據(jù)接收端诡右。這個(gè)基本的流程你需要知道,就是每個(gè)數(shù)據(jù)都會(huì)經(jīng)過(guò)數(shù)據(jù)的封裝和解封裝的過(guò)程轻猖。 在OSI七層模型中帆吻,每一層的作用和對(duì)應(yīng)的協(xié)議如下:


OSI七層網(wǎng)絡(luò)對(duì)應(yīng)的協(xié)議

TCP報(bào)文段的首部格式

  • Source Port和Destination Port:分別占用16位,表示源端口號(hào)和目的端口號(hào)蜕依;用于區(qū)別主機(jī)中的不同進(jìn)程桅锄,而IP地址是用來(lái)區(qū)分不同的主機(jī)的,源端口號(hào)和目的端口號(hào)配合上IP首部中的源IP地址和目的IP地址就能唯一的確定一個(gè)TCP連接样眠;
  • Sequence Number:用來(lái)標(biāo)識(shí)從TCP發(fā)端向TCP收端發(fā)送的數(shù)據(jù)字節(jié)流友瘤,它表示在這個(gè)報(bào)文段中的的第一個(gè)數(shù)據(jù)字節(jié)在數(shù)據(jù)流中的序號(hào);主要用來(lái)解決網(wǎng)絡(luò)報(bào)亂序的問(wèn)題檐束;
  • Acknowledgment Number:32位確認(rèn)序列號(hào)包含發(fā)送確認(rèn)的一端所期望收到的下一個(gè)序號(hào)辫秧,因此,確認(rèn)序號(hào)應(yīng)當(dāng)是上次已成功收到數(shù)據(jù)字節(jié)序號(hào)加1被丧。不過(guò)盟戏,只有當(dāng)標(biāo)志位中的ACK標(biāo)志(下面介紹)為1時(shí)該確認(rèn)序列號(hào)的字段才有效。主要用來(lái)解決不丟包的問(wèn)題甥桂;
  • Offset:給出首部中32 bit字的數(shù)目柿究,需要這個(gè)值是因?yàn)槿芜x字段的長(zhǎng)度是可變的。這個(gè)字段占4bit(最多能表示15個(gè)32bit的的字黄选,即4*15=60個(gè)字節(jié)的首部長(zhǎng)度)蝇摸,因此TCP最多有60字節(jié)的首部婶肩。然而,沒(méi)有任選字段貌夕,正常的長(zhǎng)度是20字節(jié)律歼;
  • TCP Flags:TCP首部中有6個(gè)標(biāo)志比特,它們中的多個(gè)可同時(shí)被設(shè)置為1啡专,主要是用于操控TCP的狀態(tài)機(jī)的险毁,依次為URG,ACK们童,PSH畔况,RST,SYN病附,F(xiàn)IN问窃。每個(gè)標(biāo)志位的意思如下:
    • URG:此標(biāo)志表示TCP包的緊急指針域(后面馬上就要說(shuō)到)有效,用來(lái)保證TCP連接不被中斷完沪,并且督促中間層設(shè)備要盡快處理這些數(shù)據(jù)域庇;
    • ACK:此標(biāo)志表示應(yīng)答域有效,就是說(shuō)前面所說(shuō)的TCP應(yīng)答號(hào)將會(huì)包含在TCP數(shù)據(jù)包中覆积;有兩個(gè)取值:0和1听皿,為1的時(shí)候表示應(yīng)答域有效,反之為0宽档;
    • PSH:這個(gè)標(biāo)志位表示Push操作尉姨。所謂Push操作就是指在數(shù)據(jù)包到達(dá)接收端以后,立即傳送給應(yīng)用程序吗冤,而不是在緩沖區(qū)中排隊(duì)又厉;
    • RST:這個(gè)標(biāo)志表示連接復(fù)位請(qǐng)求。用來(lái)復(fù)位那些產(chǎn)生錯(cuò)誤的連接椎瘟,也被用來(lái)拒絕錯(cuò)誤和非法的數(shù)據(jù)包覆致;
    • SYN:表示同步序號(hào),用來(lái)建立連接肺蔚。SYN標(biāo)志位和ACK標(biāo)志位搭配使用煌妈,當(dāng)連接請(qǐng)求的時(shí)候,SYN=1宣羊,ACK=0璧诵;連接被響應(yīng)的時(shí)候,SYN=1仇冯,ACK=1之宿;這個(gè)標(biāo)志的數(shù)據(jù)包經(jīng)常被用來(lái)進(jìn)行端口掃描。掃描者發(fā)送一個(gè)只有SYN的數(shù)據(jù)包苛坚,如果對(duì)方主機(jī)響應(yīng)了一個(gè)數(shù)據(jù)包回來(lái) 澈缺,就表明這臺(tái)主機(jī)存在這個(gè)端口坪创;但是由于這種掃描方式只是進(jìn)行TCP三次握手的第一次握手炕婶,因此這種掃描的成功表示被掃描的機(jī)器不很安全姐赡,一臺(tái)安全的主機(jī)將會(huì)強(qiáng)制要求一個(gè)連接嚴(yán)格的進(jìn)行TCP的三次握手;
    • FIN:表示發(fā)送端已經(jīng)達(dá)到數(shù)據(jù)末尾柠掂,也就是說(shuō)雙方的數(shù)據(jù)傳送完成项滑,沒(méi)有數(shù)據(jù)可以傳送了,發(fā)送FIN標(biāo)志位的TCP數(shù)據(jù)包后涯贞,連接將被斷開(kāi)枪狂。這個(gè)標(biāo)志的數(shù)據(jù)包也經(jīng)常被用于進(jìn)行端口掃描。
  • Window:窗口大小宋渔,也就是有名的滑動(dòng)窗口州疾,用來(lái)進(jìn)行流量控制。

三次握手和四次揮手

TCP的三次握手和四次揮手

三次握手的過(guò)程

  • 第一次握手:建立連接皇拣⊙媳停客戶(hù)端發(fā)送連接請(qǐng)求報(bào)文段,將SYN位置設(shè)置為1氧急,Sequence Number為x颗胡;然后,客戶(hù)端進(jìn)入SYN_SEND狀態(tài)吩坝,等待服務(wù)器的確認(rèn)毒姨。
  • 第二次握手:服務(wù)器收到SYN報(bào)文段。服務(wù)器收到客戶(hù)端的SYN報(bào)文段钉寝,需要對(duì)這個(gè)SYN報(bào)文段進(jìn)行確認(rèn)弧呐,設(shè)置Acknowledgment Number為x+1(Sequence Number+1);同時(shí)嵌纲,自己還要發(fā)送SYN請(qǐng)求信息俘枫,將SYN位置為1,Sequence Number為y疹瘦;服務(wù)器端將上述所有信息放到一個(gè)報(bào)文段(即SYN+ACK報(bào)文段)中崩哩,一并發(fā)送給客戶(hù)端,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài)言沐。
  • 第三次握手:客戶(hù)端收到服務(wù)器的SYN+ACK報(bào)文段邓嘹。然后將Acknowledgment Number設(shè)置為y+1,向服務(wù)器發(fā)送ACK報(bào)文段险胰,這個(gè)報(bào)文段發(fā)送完畢以后汹押,客戶(hù)端和服務(wù)器端都進(jìn)入ESTABLISHED狀態(tài),完成TCP三次握手起便。
    完成了三次握手棚贾,客戶(hù)端和服務(wù)器端就可以開(kāi)始傳送數(shù)據(jù)窖维。

為什么要三次握手?

三次握手的目的是為了解決網(wǎng)絡(luò)中存在延遲的重復(fù)分組的問(wèn)題妙痹。
已失效的連接請(qǐng)求報(bào)文段產(chǎn)生在這樣一種情況下:client發(fā)出的第一個(gè)連接請(qǐng)求報(bào)文段并沒(méi)有丟失铸史,而是在某個(gè)網(wǎng)絡(luò)結(jié)點(diǎn)長(zhǎng)時(shí)間的滯留了,以致延誤到連接釋放以后的某個(gè)時(shí)間才到達(dá)server怯伊。本來(lái)這是一個(gè)早已失效的報(bào)文段琳轿。但server收到此失效的連接請(qǐng)求報(bào)文段后,就誤認(rèn)為是client再次發(fā)出的一個(gè)新的連接請(qǐng)求耿芹。于是就向client發(fā)出確認(rèn)報(bào)文段崭篡,同意建立連接。假設(shè)不采用三次握手吧秕,那么只要server發(fā)出確認(rèn)琉闪,新的連接就建立了。由于現(xiàn)在client并沒(méi)有發(fā)出建立連接的請(qǐng)求砸彬,因此不會(huì)理睬server的確認(rèn)颠毙,也不會(huì)向server發(fā)送數(shù)據(jù)。但server卻以為新的運(yùn)輸連接已經(jīng)建立拿霉,并一直等待client發(fā)來(lái)數(shù)據(jù)吟秩。這樣,server的很多資源就白白浪費(fèi)掉了绽淘。采用三次握手的辦法可以防止上述現(xiàn)象發(fā)生涵防。例如剛才那種情況,client不會(huì)向server的確認(rèn)發(fā)出確認(rèn)沪铭。server由于收不到確認(rèn)壮池,就知道client并沒(méi)有要求建立連接。

為什么要四次分手杀怠?

TCP協(xié)議是一種面向連接的椰憋、可靠的、基于字節(jié)流的運(yùn)輸層通信協(xié)議赔退。TCP是全雙工模式橙依,這就意味著,當(dāng)主機(jī)1發(fā)出FIN報(bào)文段時(shí)硕旗,只是表示主機(jī)1已經(jīng)沒(méi)有數(shù)據(jù)要發(fā)送了窗骑,主機(jī)1告訴主機(jī)2,它的數(shù)據(jù)已經(jīng)全部發(fā)送完畢了漆枚;但是创译,這個(gè)時(shí)候主機(jī)1還是可以接受來(lái)自主機(jī)2的數(shù)據(jù);當(dāng)主機(jī)2返回ACK報(bào)文段時(shí)墙基,表示它已經(jīng)知道主機(jī)1沒(méi)有數(shù)據(jù)發(fā)送了软族,但是主機(jī)2還是可以發(fā)送數(shù)據(jù)到主機(jī)1的刷喜;當(dāng)主機(jī)2也發(fā)送了FIN報(bào)文段時(shí),這個(gè)時(shí)候就表示主機(jī)2也沒(méi)有數(shù)據(jù)要發(fā)送了立砸,就會(huì)告訴主機(jī)1掖疮,我也沒(méi)有數(shù)據(jù)要發(fā)送了,之后彼此就會(huì)愉快的中斷這次TCP連接仰禽。如果要正確的理解四次分手的原理氮墨,就需要了解四次分手過(guò)程中的狀態(tài)變化。

四次分手過(guò)程中的狀態(tài)變化

  • FIN_WAIT_1:這個(gè)狀態(tài)要好好解釋一下吐葵,其實(shí)FIN_WAIT_1和FIN_WAIT_2狀態(tài)的真正含義都是表示等待對(duì)方的FIN報(bào)文。而這兩種狀態(tài)的區(qū)別是:FIN_WAIT_1狀態(tài)實(shí)際上是當(dāng)SOCKET在ESTABLISHED狀態(tài)時(shí)桥氏,它想主動(dòng)關(guān)閉連接温峭,向?qū)Ψ桨l(fā)送了FIN報(bào)文,此時(shí)該SOCKET即進(jìn)入到FIN_WAIT_1狀態(tài)字支。而當(dāng)對(duì)方回應(yīng)ACK報(bào)文后凤藏,則進(jìn)入到FIN_WAIT_2狀態(tài),當(dāng)然在實(shí)際的正常情況下堕伪,無(wú)論對(duì)方何種情況下揖庄,都應(yīng)該馬上回應(yīng)ACK報(bào)文,所以FIN_WAIT_1狀態(tài)一般是比較難見(jiàn)到的欠雌,而FIN_WAIT_2狀態(tài)還有時(shí)常程闵遥可以用netstat看到。(主動(dòng)方)
  • FIN_WAIT_2:上面已經(jīng)詳細(xì)解釋了這種狀態(tài)富俄,實(shí)際上FIN_WAIT_2狀態(tài)下的SOCKET禁炒,表示半連接,也即有一方要求close連接霍比,但另外還告訴對(duì)方幕袱,我暫時(shí)還有點(diǎn)數(shù)據(jù)需要傳送給你(ACK信息),稍后再關(guān)閉連接悠瞬。(主動(dòng)方)
  • CLOSE_WAIT:這種狀態(tài)的含義其實(shí)是表示在等待關(guān)閉们豌。怎么理解呢?當(dāng)對(duì)方close一個(gè)SOCKET后發(fā)送FIN報(bào)文給自己浅妆,你系統(tǒng)毫無(wú)疑問(wèn)地會(huì)回應(yīng)一個(gè)ACK報(bào)文給對(duì)方望迎,此時(shí)則進(jìn)入到CLOSE_WAIT狀態(tài)。接下來(lái)呢狂打,實(shí)際上你真正需要考慮的事情是察看你是否還有數(shù)據(jù)發(fā)送給對(duì)方擂煞,如果沒(méi)有的話(huà),那么你也就可以 close這個(gè)SOCKET趴乡,發(fā)送FIN報(bào)文給對(duì)方对省,也即關(guān)閉連接蝗拿。所以你在CLOSE_WAIT狀態(tài)下,需要完成的事情是等待你去關(guān)閉連接蒿涎。(被動(dòng)方)
  • LAST_ACK:這個(gè)狀態(tài)還是比較容易好理解的哀托,它是被動(dòng)關(guān)閉一方在發(fā)送FIN報(bào)文后,最后等待對(duì)方的ACK報(bào)文劳秋。當(dāng)收到ACK報(bào)文后仓手,也即可以進(jìn)入到CLOSED可用狀態(tài)了。(被動(dòng)方)
    TIME_WAIT:表示收到了對(duì)方的FIN報(bào)文玻淑,并發(fā)送出了ACK報(bào)文嗽冒,就等2MSL后即可回到CLOSED可用狀態(tài)了。如果FINWAIT1狀態(tài)下补履,收到了對(duì)方同時(shí)帶FIN標(biāo)志和ACK標(biāo)志的報(bào)文時(shí)添坊,可以直接進(jìn)入到TIME_WAIT狀態(tài),而無(wú)須經(jīng)過(guò)FIN_WAIT_2狀態(tài)箫锤。(主動(dòng)方)
  • CLOSED:表示連接中斷贬蛙。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市谚攒,隨后出現(xiàn)的幾起案子阳准,更是在濱河造成了極大的恐慌,老刑警劉巖馏臭,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件野蝇,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡位喂,警方通過(guò)查閱死者的電腦和手機(jī)浪耘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)塑崖,“玉大人七冲,你說(shuō)我怎么就攤上這事」嫫牛” “怎么了澜躺?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)抒蚜。 經(jīng)常有香客問(wèn)我掘鄙,道長(zhǎng),這世上最難降的妖魔是什么嗡髓? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任操漠,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘浊伙。我一直安慰自己撞秋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布嚣鄙。 她就那樣靜靜地躺著吻贿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哑子。 梳的紋絲不亂的頭發(fā)上舅列,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音卧蜓,去河邊找鬼帐要。 笑死,一個(gè)胖子當(dāng)著我的面吹牛烦却,可吹牛的內(nèi)容都是我干的宠叼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼其爵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了伸蚯?” 一聲冷哼從身側(cè)響起摩渺,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎剂邮,沒(méi)想到半個(gè)月后摇幻,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挥萌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年绰姻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片引瀑。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡狂芋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出憨栽,到底是詐尸還是另有隱情帜矾,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布屑柔,位于F島的核電站屡萤,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏掸宛。R本人自食惡果不足惜死陆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望唧瘾。 院中可真熱鬧措译,春花似錦别凤、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至掠械,卻和暖如春由缆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背猾蒂。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工均唉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肚菠。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓舔箭,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蚊逢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子层扶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1.這篇文章不是本人原創(chuàng)的,只是個(gè)人為了對(duì)這部分知識(shí)做一個(gè)整理和系統(tǒng)的輸出而編輯成的烙荷,在此鄭重地向本文所引用文章的...
    SOMCENT閱讀 13,069評(píng)論 6 174
  • 本文主要通過(guò)整理網(wǎng)絡(luò)上的資料镜会,整理出的關(guān)于TCP方面的簡(jiǎn)單理論知識(shí)。作為Java程序員雖然更多的時(shí)候我們都是直接調(diào)...
    tomas家的小撥浪鼓閱讀 5,546評(píng)論 1 100
  • 個(gè)人認(rèn)為终抽,Goodboy1881先生的TCP /IP 協(xié)議詳解學(xué)習(xí)博客系列博客是一部非常精彩的學(xué)習(xí)筆記戳表,這雖然只是...
    貳零壹柒_fc10閱讀 5,054評(píng)論 0 8
  • 18.1 引言 TCP是一個(gè)面向連接的協(xié)議。無(wú)論哪一方向另一方發(fā)送數(shù)據(jù)之前昼伴,都必須先在雙方之間建立一條連接匾旭。本章將...
    張芳濤閱讀 3,383評(píng)論 0 13
  • 最近在惡補(bǔ)計(jì)算機(jī)網(wǎng)絡(luò)方面的知識(shí),之前對(duì)于TCP的三次握手和四次分手也是模模糊糊圃郊,對(duì)于其中的細(xì)節(jié)更是渾然不知价涝,最近看...
    微醺歲月閱讀 9,534評(píng)論 4 128