1.TCP建立連接時需要幾次握手红竭, 斷開連接需要幾次握手艰赞?
TCP建立連接需要三次握手浴栽, 斷開連接要四次握手。現(xiàn)有客戶端A發(fā)送數(shù)據(jù)到服務(wù)端B:
- 在建立連接時客戶端首先發(fā)送SYN包請求建立連接涎劈。
- 當服務(wù)器收到SYN包后發(fā)送ACK+SYN包針對受到的SYN包應(yīng)答广凸。
- 客戶端受到服務(wù)端的ACK應(yīng)答后發(fā)送ACK包,針對SYN的確認應(yīng)答蛛枚。此時三次握手建立連接谅海。
當客戶端要斷開連接時共四次握手:
- 客戶端發(fā)送FIN包請求斷開連接。
- 服務(wù)器受到客戶端消息蹦浦, 發(fā)送ACK包應(yīng)答扭吁。
- 服務(wù)端發(fā)送FIN包請求斷開連接。
- 客戶端發(fā)送ACK應(yīng)該服務(wù)器的斷開請求盲镶。
2.客戶端每發(fā)送一個包侥袜, 服務(wù)器都要返回確認應(yīng)答嗎
當客戶端每次發(fā)送數(shù)據(jù)包時, 服務(wù)器端不一定發(fā)送確認應(yīng)答溉贿, 當引入滑動窗口概念后枫吧,為了減少網(wǎng)絡(luò)消耗。服務(wù)器可以每接受到兩個請求包再做一次應(yīng)答(延遲應(yīng)答)顽照, 也可以接受完包后由蘑,將處理完的數(shù)據(jù)一起作為返回數(shù)據(jù)(稍代應(yīng)答)。
3.TCP 發(fā)送/接受數(shù)據(jù)的大小
TCP在三次握手建立連接時就會確定發(fā)送數(shù)據(jù)包的大小MSS(Maximun Segment Size)代兵。在建立連接時尼酿, TCP請求/確認包的首部會寫入MSS信息。此時會選擇一個較小的MISS作為每次發(fā)送數(shù)據(jù)的最大長度植影。 當TCP發(fā)送大量數(shù)據(jù)的時候裳擎, 會將數(shù)據(jù)分割成不超過MSS的數(shù)據(jù)分批發(fā)送。
4.TCP如何將大量數(shù)據(jù)切片處理后發(fā)送/重發(fā)
首先TCP包的首部中有兩個字段序列號(Destination Port), 確認應(yīng)答號(Acknowledgement Number)思币÷瓜欤客戶端對發(fā)送的數(shù)據(jù)在首部的序列號中寫入數(shù)據(jù)段的編號羡微, 服務(wù)器收到數(shù)據(jù)段后查詢序列號跟數(shù)據(jù)的長度,并計算出下次應(yīng)該接受的序列號并寫入確認應(yīng)答號作為確認應(yīng)答發(fā)送出去惶我。TCP根據(jù)序列號根和確認應(yīng)答號將大量數(shù)據(jù)切片發(fā)送妈倔。
5.TCP窗口有什么用
TCP通過窗口提高發(fā)送確認應(yīng)答速度。TCP傳輸以一個段為單位绸贡,每發(fā)送一次進行一次確認應(yīng)答盯蝴。包的往返時間越長通信性能越低。為了解決這個問題TCP引入的窗口的概念听怕, 此時TCP并不是等到接受到確認應(yīng)答后才發(fā)送數(shù)據(jù)捧挺。 而是一次性發(fā)送多個數(shù)據(jù)段(發(fā)送數(shù)據(jù)段的多少取決于窗口的大小), 主機在未收到確認回復(fù)之前是要保存已經(jīng)發(fā)送過的數(shù)據(jù)尿瞭, 為的是重新發(fā)送闽烙。
6. 在使用窗口時, 服務(wù)器沒有收到某一個數(shù)據(jù)段声搁, 或者主機沒有收到服務(wù)器的確認消息怎么辦
窗口在一定程度上比較大時黑竞, 即使有少部分的確認應(yīng)答丟失時, 也不會進行數(shù)據(jù)重發(fā)疏旨√埽可以通過下一個確認應(yīng)答確認。
上圖中充石, 窗口丟失了1001的確認應(yīng)答。雖然客戶端沒有收到相應(yīng)的確認應(yīng)答霞玄。 但是當收到2001的確認應(yīng)答(提示服務(wù)器骤铃, 我想收到從2001開始的數(shù)據(jù))時,就會以為服務(wù)器收到了1001的數(shù)據(jù)段坷剧。
當一段報文丟失導(dǎo)致服務(wù)器沒有收到惰爬, 那么服務(wù)器就會發(fā)送報文提示客戶端(服務(wù)器要接收從xxxx開始的報文)。如果客戶端連續(xù)收到相同的請求時惫企, 則會發(fā)送相應(yīng)的數(shù)據(jù)報文撕瞧。
7.窗口大小的值是由誰決定的
窗口的大小是由接受端主機決定的, TCP首部中專門有一個字段來通知窗口的大小狞尔。接受主機將自己的緩沖區(qū)大小放入這個字段中通知給發(fā)送端(根據(jù)緩沖區(qū)的大小丛版, 隨時設(shè)置窗口大小發(fā)送給發(fā)送段從而控制發(fā)送量)。發(fā)送端會根據(jù)接受主機提示偏序, 對數(shù)據(jù)的發(fā)送量進行控制页畦。
8.剛開始通信的時候, 窗口的大小是如何確定的**
由于兩臺主機間的網(wǎng)絡(luò)可能很復(fù)雜研儒,通過廣域網(wǎng)時豫缨,中間的路由器轉(zhuǎn)發(fā)能力可能是瓶頸独令。也就是說,如果一方簡單的按照另一方主機三次握手時通告的滑動窗口大小來發(fā)送數(shù)據(jù)的話好芭,可能會使得網(wǎng)絡(luò)上的轉(zhuǎn)發(fā)路由器性能雪上加霜燃箭,最終丟失更多的分組。在通信一開始就會通過叫做慢啟動的算法得一個值舍败, 對發(fā)送數(shù)量進行控制招狸。這個值就是所謂的阻塞窗口, 阻塞窗口的大小不會超過滑動窗口瓤湘。
9.MSS會改變了嗎?
MSS就是為了避免IP層分片瓢颅,在建立握手時告知對方期望接收的MSS值并不一定靠得住。因為這個值是預(yù)估的弛说,TCP連接上的兩臺主機若處于不同的網(wǎng)絡(luò)中挽懦,那么,連接上可能有許多中間網(wǎng)絡(luò)木人,這些網(wǎng)絡(luò)分別具有不同的數(shù)據(jù)鏈路層信柿,這樣,TCP連接上有許多個MTU醒第。特別是渔嚷,若中間途徑的MTU小于兩臺主機所在的網(wǎng)絡(luò)MTU時,選定的MSS仍然太大了稠曼,會導(dǎo)致中間路由器出現(xiàn)IP層的分片形病。所以這個時候需要重新計算MSS大小。
怎樣避免中間網(wǎng)絡(luò)可能出現(xiàn)的分片呢霞幅?
通過IP頭部的DF標志位漠吻,這個標志位是告訴IP報文所途經(jīng)的所有IP層代碼:不要對這個報文分片。如果一個IP報文太大必須要分片司恳,則直接返回一個ICMP錯誤途乃,說明必須要分片了,且待分片路由器網(wǎng)絡(luò)接受的MTU值扔傅。這樣耍共,連接上的發(fā)送方主機就可以重新確定MSS。
10. Nagle算法有什么用猎塞?
Nagle算法主要是提高網(wǎng)絡(luò)利用率试读。如果發(fā)送端有數(shù)據(jù),但是發(fā)送端數(shù)據(jù)很小的話則進行延遲發(fā)送的一種機制荠耽。各種做法可能造成網(wǎng)絡(luò)延遲鹏往。
- 延遲確認應(yīng)答
如果接受端受到消息后立即應(yīng)答的話, 那么可能會返回一個小的窗口值(剛接收完緩沖區(qū)比較滿)。而是選擇過一段時間應(yīng)應(yīng)答伊履。事實上也不需要每次接受都需要應(yīng)答韩容。據(jù)大多數(shù)采用接收兩個數(shù)據(jù)段返回一次應(yīng)答。 - 稍帶應(yīng)答
TCP包中既能發(fā)送數(shù)據(jù)也能發(fā)送應(yīng)答的一種機制唐瀑。不過捎帶應(yīng)答需要服務(wù)器處理完數(shù)據(jù)并將處理完回執(zhí)的數(shù)據(jù)返回為止群凶。