1. 程式人生 > >TCP/IP常見問題總結(一)

TCP/IP常見問題總結(一)

一下為一些常見的TCP/IP問題總結:

1. OSI與TCP/IP各層的結構與功能,都有哪些協議

計算機網路分層
網際網路主要分為五層:
  1. 物理層:通過線路(可以是有形的線也可以是無線鏈路)傳送原始的位元(bit)流,只完成一個節點到另一個節點的傳送(單跳)
  2. 資料鏈路層:通過物理網路傳送幀,只完成一個節點到另一個節點的傳送(單跳)(hop-by-hop, node-to-node)
  3. 網路層:把包裡面的目的地址拿出來,進行路由選擇(routing),決定要往哪個方向傳輸,負責從源(source)通過路由選擇到目的地(destination)的過程,達到從源主機傳輸資料到目標主機的目的(host-to-host)
  4. 傳輸層:也稱為端到端傳輸,網路層只把資料送到主機,但不會送到程序。傳輸層負責負責程序與主機(host)間的傳輸,主機到主機(host-to-host)的傳輸交由網路層負責。在七層模型中,傳輸層還可以細分為會話層和展示層:
    • 會話層:通過資料流建立會話關係
    • 展示層:資料壓縮、解壓,加密、解密,資料型別、格式變換等一切與資料展示有關的操作
應用層:專門針對某些應用提供服務
網路層有如下協議: 網路層協議
傳輸層主要有TCP(傳輸控制協議)與UDP(使用者資料報協議)兩種協議。 應用層有如下協議: 應用層協議

2. TCP與UDP的區別

TCP即傳輸控制協議,UDP即使用者資料報協議,他們的區別主要有以下幾點:
  1. TCP協議是面向連線的,傳送資料之前需要建立連線;UDP協議是無連線的,傳送資料之前不需要建立連線
  2. TCP協議提供可靠的傳輸服務;UDP協議提供不可靠的傳輸服務
  3. TCP傳送資料大小會受傳送視窗、接收視窗及MSS(最大報文段)限制,因此會分為多段傳送;UDP傳送資料大小即為資料本身大小
  4. TCP擁有眾多反饋機制與附加機制;UDP沒有反饋機制
  5. TCP傳輸速度較慢;UDP傳輸速度較快
總的來說,TCP協議提供面向連線的,可靠的傳輸服務,但速度較慢,適合檔案下載等傳輸任務;UDP協議提供無連線的,不可靠的傳輸服務,但速度較快,適合媒體流等看重傳輸速度的傳輸任務。

3. TCP報文結構

TCP段結構如下: TCP段結構
其中:
  • Source port:源埠,16位,說明發送端的埠號
  • Destination port:目的埠,16位,說明接收端的埠號
  • Sequence number:序列號,32位,說明這個資料的序號,從而接收端接收後可以進行排序,避免接收錯序
  • Acknowledgement number:確認號,ACK,32位,表示說明這是對哪個資料的確認,表明期待接收編號為x的資料段,小於x的資料段已經成功接收並交給了上層
  • TCP header length:TCP頭部長度,4位,由於TCP頭部中帶有option,而option的長度不固定,因此需要標識頭部的長度
  • 0(灰色那段):padding,6位,無實際作用
  • 標誌位:6位,作用分別如下:
    • URG:說明資料部分是否有緊急資料,可能導致亂序問題,因此並不會在實際中被使用
    • ACK:說明確認號是否有效
    • PSH:告訴接收方將緩衝區的資料儘快交給上層,可能會導致資料丟失,因此不會在實際中被使用
    • RST:重置連線,將連線強制中斷
    • SYN:同步標識,建立連線時使用
    • FIN:結束標識,關閉連線時使用
  • Window size:視窗大小,16位,傳送端告訴接收端自己的傳送視窗的緩衝區大小
  • Checksum:校驗和,16位
  • Urgent pointer:緊急資料指標,16位,說明資料段中哪一段資料是緊急資料
  • Options:0或32位,選項部分
  • Data:資料部分

4. TCP的三次握手與四次揮手過程,各個狀態名稱與含義,TIMEWAIT的作用

TCP三次握手

其示意圖如下: TCP三次握手
三次握手是指TCP建立連線的過程,顧名思義,主要分為3個步驟:
  1. 客戶機發起請求
    • SYN為1:說明發起新的連線
    • SEQ為x:說明這個段的序列號是多少,伺服器收到後會調整接收的滑動視窗為x+1(表明下一次要接收的段的序列號為x+1),一般隨機選取x
    • 指定視窗大小的值:客戶機說明自己的接收視窗目前還可容納多少資料
  2. 伺服器響應請求
    • ACK為1:表示確認接收請求
    • ACK號為x+1:表示接受了序列號位x及以下的資料,期待序列號為x+1的資料
    • SYN為1:說明伺服器同意新的連線建立(只是同意,還沒有沒有分配埠資源)
    • SEQ為y:說明這個段的序列號是多少,客戶機收到後會調整接收的滑動視窗為y+1(表明下一次要接收的段的序列號為y+1),與x沒有關係
    • 指定視窗大小的值:伺服器說明自己的接收視窗目前還可容納多少資料
  3. 伺服器響應請求
    • ACK為1:表示確認接收請求
    • ACK號為y+1:表示接受了序列號位y及以下的資料,期待序列號為y+1的資料
    • SEQ為x+1:說明這個段的序列號是多少,伺服器收到後會調整接收的滑動視窗為x+2(表明下一次要接收的段的序列號為x+2)
看完三次握手我們不禁有疑問,為什麼需要三次握手呢?一次握手,兩次握手為什麼不行呢? 原因如下:
  • 一次握手:客戶機根本不知道連線的有效性
    • 有可能這次握手請求根本沒有到達伺服器或者直接被伺服器拒絕
  • 兩次握手:伺服器無法確認該請求的合法性,如果是兩次握手伺服器將立即分配埠資源造成資源浪費,可能使得其它客戶機無法連線
    • 傳送方請求連線的包在信道里面停留了很長時間,使得連線都釋放掉了這個包才到
    • 會遭遇SYN泛洪攻擊:一臺惡意的主機偽造自己的IP向伺服器請求連線

TCP四次握手

其示意圖如下: TCP四次握手
TCP四次握手是指TCP釋放連線的過程,顧名思義,主要分為4個步驟:
  1. 釋放連線的發起方發起釋放連線請求
    • FIN為1:結束位為1,說明發起方的傳送過程已經結束,不會再向對方傳送實際資料
    • SEQ為x:序列號為x
  2. 釋放連線的接收方回覆釋放連線請求
    • ACK為1:表示確認接收請求
    • ACK號為x+1:表示接受了序列號位x及以下的資料,期待序列號為x+1的資料
  3. 釋放連線的接收方同意釋放連線請求
    • FIN為1:結束位為1,說明發起方的傳送過程已經結束,不會再向對方傳送實際資料
    • SEQ為y:序列號為y
  4. 釋放連線的發起方回覆釋放連線請求
    • ACK為1:表示確認接收請求
    • ACK號為y+1:表示接受了序列號位x及以下的資料,期待序列號為y+1的資料

發起方在第四次握手發出ACK後會等待一段時間後再正式釋放連線,這段時間被稱為TIME_WAIT。會有TIME_WAIT的原因主要是保證接收方能夠收到對於FIN的ACK,如果ACK在返回的過程中丟失會導致接收方超時,這時會再發一個FIN給到發起方,因此這一段時間正好是ACK返回時間加上重發的FIN到達發起方的時間。另一個原因是如果沒有TIME_WAIT就馬上建立了新的連線,那麼網路中遺留下來的舊的資料包將可能會干擾接收方的接收,接收方無法識別出是新的資料包還是舊的資料包,因此在TIME_WAIT接收到的其它資料包會被丟棄。 其實TCP釋放連線的方法除了四次握手外還有直接重置RST的強制釋放方法,在此不再贅述。

5. TCP擁塞控制

由於傳送方到接收方之間的通道是公用的,因此如果傳送方不考慮中間通道的容量隨意傳送就可能出現擁塞,擁塞會導致延遲嚴重,甚至大量丟包,因此我們需要進行擁塞控制。 擁塞控制的關鍵在於控制傳送端的傳送速率,傳送端的傳送速率受到傳送視窗大小的限制,因此在TCP的擁塞控制中實際控制的是傳送端的傳送視窗大小。
當出現以下兩種情況之一時,我們斷定傳輸出現了擁塞:
  1. 連續(三個)的序號為x的ACK:說明序號為x的TCP資料段很可能丟失
  2. 超時時間到來前未收到ACK
當出現擁塞時,我們主要有以下方法進行擁塞控制: TCP擁塞控制

AIMD

AIMD(additive increase multiplicative decrease)的意思即加性增加乘性減少,其初始擁塞視窗大小為任意值。 當我們每成功傳輸一個TCP資料段,擁塞視窗大小加1MSS(最大報文大小),此為加性增加;而當我們發現傳輸出現擁塞時,擁塞視窗大小減半,此為乘性減少。 這種演算法的問題在於增加的速度慢,丟包代價大。

慢啟動

慢啟動的初始時擁塞視窗大小為1MSS(因此叫慢啟動演算法),最大為65535MSS(視窗大小隻有16bit,因此最大也只能這麼大)。慢啟動演算法開始時每成功傳輸一個TCP資料段,擁塞窗開大小也是增加1MSS,但當其發現擁塞時,會首先確定一個闕值:闕值為當前視窗大小的一半,然後根據不同的機制進行處理:

Tahoe機制

出現擁塞時視窗大小會變回1MSS,但當視窗大小小於闕值時,傳輸成功視窗大小加倍(指數增長),大於闕值後改為加性增長。

Reno機制

出現擁塞視窗大小直接變為闕值。(也稱為快速恢復機制)