傳輸層(TCP,UDP)

TCP首部

tcp是一個面向連接奈应,可靠的字節(jié)流傳輸協(xié)議澜掩, TCP不提供廣播和多播,一般用于文件傳輸杖挣,收發(fā)郵件肩榕,遠程登錄等場景。

1程梦、第一個4字節(jié):

(1)源端口点把,16位橘荠;發(fā)送數(shù)據(jù)的源進程端口

(2)目的端口屿附,16位;接收數(shù)據(jù)的進程端口

2哥童、第二個4字節(jié)與第三個4字節(jié)

(1)序號挺份,32位;代表當前TCP數(shù)據(jù)段第一個字節(jié)占整個字節(jié)流的相對位置贮懈;

(2)確認號匀泊,32位;代表接收端希望接收的數(shù)據(jù)序號朵你,為上次接收到數(shù)據(jù)報的序號+1各聘,當ACK標志位為1時才生效。

3抡医、第四個4字節(jié):

(1)數(shù)據(jù)偏移躲因,4位拱她;實際代表TCP首部長度睹簇,最大為60字節(jié)。

(2)6個標志位苛败,每個標志位1位水孩;

SYN镰矿,為同步標志,用于數(shù)據(jù)同步俘种;

ACK秤标,為確認序號绝淡,ACK=1時確認號才有效;

FIN苍姜,為結束序號够委,用于發(fā)送端提出斷開連接;

URG怖现,為緊急序號茁帽,URG=1是緊急指針有效;

PSH屈嗤,指示接收方立即將數(shù)據(jù)提交給應用層潘拨,而不是等待緩沖區(qū)滿;

RST饶号,重置連接铁追。

(3)滑動窗口值,16位茫船;標識接收方可接受的數(shù)據(jù)字節(jié)數(shù)琅束。

4、第五個4字節(jié)

(1)校驗和算谈,16位涩禀;用于檢驗數(shù)據(jù)完整性。

(2)緊急指針然眼,16位艾船;只有當URG標識位為1時,緊急指針才有效高每。緊急指針的值與序號的相加值為緊急數(shù)據(jù)的最后一個字節(jié)位置屿岂。用于發(fā)送緊急數(shù)據(jù)。


參考:https://blog.csdn.net/qq_39584315/article/details/79387811


UDP首部

udp是一個無連接不可靠的數(shù)據(jù)報傳輸協(xié)議鲸匿,一般用于即使通信爷怀,直播,視頻等形式带欢。


校驗和

Ip校驗是針對ip頭部的运授,即僅校驗ip頭部。??TCP首部校驗和計算三部分:TCP首部+TCP數(shù)據(jù)+TCP偽首部洪囤。tcp校驗需要將ip偽首部徒坡、tcp報文頭、tcp數(shù)據(jù)分為16位的字瘤缩,然后進行累加按位取反喇完。Udp校驗與tcp校驗基本上是一致的。

偽首部

  偽首部共有12字節(jié)剥啤,包含IP首部的一些字段锦溪,有如下信息:32位源IP地址不脯、32位目的IP地址、8位保留字節(jié)(置0)刻诊、8位傳輸層協(xié)議號(TCP是6防楷,UDP是17)、16位報文長度(首部+數(shù)據(jù))则涯。

?偽首部是為了增加校驗和的檢錯能力:通過偽首部的目的IP地址來檢查TCP報文是否收錯了复局、通過偽首部的傳輸層協(xié)議號來檢查傳輸層協(xié)議是否選對了。? 雖然IP首部的校驗和會校驗IP粟判,但數(shù)據(jù)包經(jīng)過中間器件(路由器)的時候亿昏,這些中間器件可能會修改IP首部的內容,例如同時修改目的IP和IP首部校驗和档礁。這樣一來將導致錯誤的接收方接收到該數(shù)據(jù)包角钩。因此在TCP的偽首部加上IP地址,可以防止錯收報文呻澜。



TCP三次握手



為什么是三次握手不是四次或兩次

可以按一下思路回答:

首先介紹tcp連接的特性:面向連接的可靠地字節(jié)流傳輸協(xié)議递礼。然后介紹tcp中的序列號和確認號(保證可靠和tcp分段傳輸)。然后介紹握手的目的:1.客戶端和服務端確認連接可通羹幸,自己能發(fā)出去對方能收到脊髓,對方能發(fā)出去,自己能收到睹欲。2.協(xié)商一個傳輸?shù)某跏夹蛄刑?/p>

為什么不是四次:

服務器的syn和ack可以整合到一次供炼,提高效率。

為什么不是兩次:

如果只有兩次窘疮,服務器沒有收到客戶端的ack,服務器無法知道服務器到客戶端的傳輸是否可靠冀墨。2.客戶端和服務器沒有就服務器的初始序列號達成一致闸衫。

參考:https://www.zhihu.com/question/24853633


四次揮手



有幾個細節(jié)需要注意:

1、與SYN報文一樣诽嘉,F(xiàn)IN報文段即使不攜帶數(shù)據(jù)蔚出,也要消耗一個序號。

2.當客戶端發(fā)送fin虫腋,服務端回復ack后骄酗,tcp連接處于半關閉狀態(tài),即客戶端已經(jīng)沒有數(shù)據(jù)要發(fā)送了悦冀,但是服務器若發(fā)送數(shù)據(jù)趋翻,客戶端依然要接受。正是因為有半關閉狀態(tài)盒蟆,不需要客戶端和服務器同時斷開踏烙,因此才會有四次揮手师骗。

3.當服務器發(fā)出fin,只要收到了客戶端的ack讨惩,就進入CLOSED狀態(tài)辟癌,關閉tcp連接。而客戶端回復ack后荐捻,必須經(jīng)過2*MSL(最長報文段壽命)的時間后黍少,才會關閉tcp連接。


為什么客戶端最后還要等待2MSL处面?

保證客戶端發(fā)送的最后一個ACK報文能夠到達服務器仍侥,因為這個ACK報文可能丟失,站在服務器的角度看來鸳君,我已經(jīng)發(fā)送了FIN+ACK報文請求斷開了农渊,客戶端還沒有給我回應,應該是我發(fā)送的請求斷開報文它沒有收到或颊,于是服務器又會重新發(fā)送一次砸紊,而客戶端就能在這個2MSL時間段內收到這個重傳的報文,接著給出回應報文囱挑,并且會重啟2MSL計時器醉顽。



tcp分段和ip分片

分組可以發(fā)生在運輸層和網(wǎng)絡層,運輸層中的TCP會分段平挑,網(wǎng)絡層中的IP會分片游添。IP層的分片更多的是為運輸層的UDP服務的,由于TCP自己會避免IP的分片通熄,所以使用TCP傳輸在IP層都不會發(fā)生分片的現(xiàn)象唆涝。IP數(shù)據(jù)報分片后,只有第一片帶有UDP首部或ICMP首部唇辨,其余的分片只有IP頭部廊酣,到了端點后根據(jù)IP頭部中的信息再網(wǎng)絡層進行重組。而TCP報文段的每個分段中都有TCP首部赏枚,到了端點后根據(jù)TCP首部的信息在傳輸層進行重組亡驰。

對IP分片的數(shù)據(jù)報來說,如果需要重傳饿幅,即使只丟失一片數(shù)據(jù)也要重新傳整個數(shù)據(jù)報凡辱,這是因為IP層本身沒有超時重傳機制。這也是為什么tcp要避免ip分片的原因栗恩。

?MTU(最大傳輸單元)

MTU是鏈路層中的網(wǎng)絡對數(shù)據(jù)幀的一個限制透乾,依然以以太網(wǎng)為例,MTU為1500個字節(jié)。一個IP數(shù)據(jù)報在以太網(wǎng)中傳輸续徽,如果它的長度大于該MTU值蚓曼,就要進行分片傳輸,使得每片數(shù)據(jù)報的長度小于MTU钦扭。分片傳輸?shù)腎P數(shù)據(jù)報不一定按序到達纫版,但IP首部中的信息能讓這些數(shù)據(jù)報片按序組裝。IP數(shù)據(jù)報的分片與重組是在網(wǎng)絡層進完成的客情。


路徑MTU

如果兩臺主機之間的通信要通過多個網(wǎng)絡其弊,那么每個網(wǎng)絡的鏈路層就可能有不同的MTU。重要的是兩臺通信主機路徑中的最小MTU膀斋。它被稱作路徑MTU梭伐。兩臺主機之間的路徑MTU不一定是個常數(shù)。它取決于當時所選擇的路由仰担。而選路不一定是對稱的(從A到B的路由可能與從B到A的路由不同)糊识,因此路徑MTU在兩個方向上不一定是一致的。


?MSS(最大分段大兴だ丁)

?MSS是TCP里的一個概念(首部的選項字段中)赂苗。MSS是TCP數(shù)據(jù)包每次能夠傳輸?shù)淖畲髷?shù)據(jù)分段,TCP報文段的長度大于MSS時贮尉,要進行分段傳輸拌滋。TCP協(xié)議在建立連接的時候通常要協(xié)商雙方的MSS值,每一方都有用于通告它期望接收的MSS選項(MSS選項只出現(xiàn)在SYN報文段中猜谚,即TCP三次握手的前兩次)败砂。MSS的值一般為MTU值減去兩個首部大小(需要減去IP數(shù)據(jù)包包頭的大小20Bytes和TCP數(shù)據(jù)段的包頭20Bytes)所以如果用鏈路層以太網(wǎng)魏铅,MSS的值往往為1460昌犹。而Internet上標準的MTU(最小的MTU,鏈路層網(wǎng)絡為x2.5時)為576沦零,那么如果不設置祭隔,則MSS的默認值就為536個字節(jié)。很多時候路操,MSS的值最好取512的倍數(shù)。TCP報文段的分段與重組是在運輸層完成的千贯。


tcp擁塞控制


TCP的四種擁塞控制算法:

1.慢開始

2.擁塞控制

3.快重傳

4.快恢復


參考:https://blog.csdn.net/qq_41431406/article/details/97926927


滑動窗口

滑動窗口協(xié)議解決的是流量控制的的問題屯仗,接收端的緩存?zhèn)鬏敂?shù)據(jù)給應用層,但這個過程不一定是即時的搔谴,如果發(fā)送速度太快魁袜,會出現(xiàn)接收端數(shù)據(jù)overflow,流量控制解決的是這個問題。

該協(xié)議允許發(fā)送方在停止并等待確認前發(fā)送多個數(shù)據(jù)分組峰弹。由于發(fā)送方不必每發(fā)一個分組就停下來等待確認店量,因此該協(xié)議可以加速數(shù)據(jù)的傳輸,提高網(wǎng)絡吞吐量鞠呈。

TCP會話的雙方都各自維護一個發(fā)送窗口和一個接收窗口融师。各自的接收窗口大小取決于應用、系統(tǒng)蚁吝、硬件的限制(TCP傳輸速率不能大于應用的數(shù)據(jù)處理速率)旱爆。各自的發(fā)送窗口則要求取決于對端通告的接收窗口。

窗口的概念

發(fā)送方的發(fā)送緩存內的數(shù)據(jù)都可以被分為4類:

1. 已發(fā)送窘茁,已收到ACK

2. 已發(fā)送怀伦,未收到ACK

3. 未發(fā)送,但允許發(fā)送

4. 未發(fā)送山林,但不允許發(fā)送

其中類型2和3都屬于發(fā)送窗口房待。

接收方的緩存數(shù)據(jù)分為3類:

1. 已接收

2. 未接收但準備接收

3. 未接收而且不準備接收

其中類型2屬于接收窗口。

滑動機制

1.發(fā)送窗口只有收到發(fā)送窗口內字節(jié)的ACK確認驼抹,才會移動發(fā)送窗口的左邊界桑孩。

2.接收窗口只有在前面所有的段都確認的情況下才會移動左邊界。當在前面還有字節(jié)未接收但收到后面字節(jié)的情況下砂蔽,窗口不會移動洼怔,并不對后續(xù)字節(jié)確認。以此確保對端會對這些數(shù)據(jù)重傳左驾。

3.遵循快速重傳镣隶、累計確認、選擇確認等規(guī)則诡右。


參考:https://blog.csdn.net/yao5hed/article/details/81046945


TCP的四個計時器

TCP中有四種計時器(Timer)安岂,分別為:

    1.重傳計時器:Retransmission Timer

    2.堅持計時器:Persistent Timer

    3.保活計時器:Keeplive Timer

    4.時間等待計時器:Timer_Wait Timer

(1)重傳計時器

當TCP發(fā)送報文段時帆吻,就創(chuàng)建該特定報文的重傳計時器域那。可能發(fā)生兩種情況:

  1.若在計時器截止時間到之前收到了對此特定報文段的確認猜煮,則撤銷此計時器次员。

  2.若在收到了對此特定報文段的確認之前計時器截止時間到,則重傳此報文段王带,并將計時器復位淑蔚。

(2)持久計時器

當接收端緩存填滿時,由于滑動窗口算法愕撰,發(fā)送端會停止發(fā)送數(shù)據(jù)刹衫,直到接收端發(fā)送一個宣布非0窗口的ack醋寝,但這個確認可能會丟失,導致發(fā)送方和接收方都等待對方發(fā)送消息带迟。

因此TCP為每一個鏈接使用一個持久計時器音羞。當發(fā)送房收到窗口大小為0的確認時,就啟動持久計時器仓犬。當持久計時器期限到時嗅绰,發(fā)送方就發(fā)送一個探測報文。這個報文段只有一個字節(jié)的數(shù)據(jù)婶肩,雖然他有一個序號办陷,但他的序號永遠不需要確認。若發(fā)送探測報文后仍沒有收到從接收端來的響應律歼,發(fā)送端會將堅持計時器設定的值加倍和復位民镜,直到這個值增大到門限值(通常是60秒)為止。

(3)毕栈伲活計時器

敝迫Γ活計時器用來防止在兩個TCP之間的連接出現(xiàn)長時間的空閑。服務器設置迸峡觯活計時器鲸鹦,每當服務器收到客戶的信息,就將計時器復位跷跪。通常設置為兩小時馋嗜。若服務器過了兩小時還沒有收到客戶的信息,他就發(fā)送探測報文段吵瞻。若發(fā)送了10個探測報文段(每一個像個75秒)還沒有響應葛菇,就假定客戶除了故障,因而就終止了該連接橡羞。

這種連接的斷開當然不會使用四次握手眯停,而是直接硬性的中斷和客戶端的TCP連接。

(4)時間等待計時器

時間等待計時器是在四次握手的時候使用的卿泽。發(fā)送最后一個ack的一端要等待2MSL(MSL=maxinum segment lifetime最長報文生存時間莺债,2MSL就是兩倍的MSL),確保另一端接受到了ack签夭。


參考:https://www.cnblogs.com/duan2/p/9180861.html

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末齐邦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子第租,更是在濱河造成了極大的恐慌侄旬,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件煌妈,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機璧诵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門汰蜘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人之宿,你說我怎么就攤上這事族操。” “怎么了比被?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵色难,是天一觀的道長。 經(jīng)常有香客問我等缀,道長枷莉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任尺迂,我火速辦了婚禮笤妙,結果婚禮上,老公的妹妹穿的比我還像新娘噪裕。我一直安慰自己蹲盘,他們只是感情好,可當我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布膳音。 她就那樣靜靜地躺著召衔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪祭陷。 梳的紋絲不亂的頭發(fā)上苍凛,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天,我揣著相機與錄音颗胡,去河邊找鬼毫深。 笑死,一個胖子當著我的面吹牛毒姨,可吹牛的內容都是我干的哑蔫。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼弧呐,長吁一口氣:“原來是場噩夢啊……” “哼闸迷!你這毒婦竟也來了?” 一聲冷哼從身側響起俘枫,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤腥沽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鸠蚪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體今阳,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡师溅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了盾舌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片墓臭。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖妖谴,靈堂內的尸體忽然破棺而出窿锉,到底是詐尸還是另有隱情,我是刑警寧澤膝舅,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布嗡载,位于F島的核電站,受9級特大地震影響仍稀,放射性物質發(fā)生泄漏洼滚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一琳轿、第九天 我趴在偏房一處隱蔽的房頂上張望判沟。 院中可真熱鬧,春花似錦崭篡、人聲如沸挪哄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽迹炼。三九已至,卻和暖如春颠毙,著一層夾襖步出監(jiān)牢的瞬間斯入,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工蛀蜜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留刻两,地道東北人。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓滴某,卻偏偏與公主長得像磅摹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子霎奢,可洞房花燭夜當晚...
    茶點故事閱讀 45,876評論 2 361