Chinaunix首页 | 论坛 | 博客
  • 博客访问: 381030
  • 博文数量: 89
  • 博客积分: 3176
  • 博客等级: 中校
  • 技术积分: 1205
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-15 10:08
文章分类

全部博文(89)

文章存档

2011年(17)

2010年(19)

2009年(35)

2008年(18)

分类: 系统运维

2009-10-26 14:39:54

 

封包的傳送

    OK,從前面這樣一路看下來,相信您對於 OSI 七層協定當中的 MAC 訊框與 IP 封包有一定程度的瞭解了, 也知道七層協定必須要在不同的主機之間一再地拿出來察看,因為 Internet 是用 IP 來傳遞封包資料,而實體線路則是使用 MAC 訊框。那我們也瞭解 TCP 封包的表頭資料後,再來就是要瞭解一下, 那我如何利用 TCP 這個傳送層的協定來進行實際的封包接收呢? 當然是得要透過 TCP 表頭的 Sequence Number 來組合收集大的 TCP 封包,也必須要透過 Code (Control Flags) 來瞭解到這個封包的特性才行。 說穿了,我們可以使用信封袋來說明,實際的內容 (data) 是在信封袋當中的, 而信封的外面的資訊就是各個封包的表頭資料啦!

    那麼如何藉由 TCP 的表頭來確認這個封包有實際被對方接收,並進一部與對方主機達成連線? 我們以底下的圖示來作為說明。

 

 

封包連接模式之三向交握视图

 

 

    在上面的封包連接模式當中,在建立連線之前都必須要通過三個確認的動作, 所以這種連線方式也就被稱為三向交握(Three-way handshake)。 那麼我們將整個流程依據上面的 A, B, C, D 四個階段來說明一下:

 

  • A:封包發起
    當用戶端想要對伺服器端連線時,就必須要送出一個要求連線的封包, 此時用戶端必須隨機取用一個大於 1024 以上的埠口來做為程式溝通的介面。然後在 TCP 的表頭當中,必須要帶有 SYN 的主動連線(SYN=1),並且記下發送出連線封包給伺服器端的序號 (Sequence number = 10001 ) 。

 

  • B:封包接收與確認封包傳送
    當伺服器接到這個封包,並且確定要接收這個封包後,就會開始製作一個同時帶有 SYN=1, ACK=1 的封包, 其中那個 acknowledge 的號碼是要給 client 端確認用的,所以該數字會比(A 步驟)裡面的 Sequence 號碼多一號 (ack = 10001+1 = 10002), 那我們伺服器也必須要確認用戶端確實可以接收我們的封包才行,所以也會發送出一個 Sequence (seq=20001) 給用戶端,並且開始等待用戶端給我們伺服器端的回應喔!

 

  • C:回送確認封包
    當用戶端收到來自伺服器端的 ACK 數字後 (10002) 就能夠確認之前那個要求封包被正確的收受了,接下來如果用戶端也同意與伺服器端建立連線時,就會再次的發送一個確認封包 (ACK=1) 給伺服器,亦即是 acknowledge = 20001+1 = 20002 囉。

 

  • D:取得最後確認
    若一切都順利,在伺服器端收到帶有 ACK=1 且 ack=20002 序號的封包後,就能夠建立起這次的連線了。

 

    也就是說,你必須要瞭解『網路是雙向的』這個事實!所以不論是伺服器端還是用戶端,都必須要透過一次 SYN 與 ACK 來建立連線, 所以總共會進行三次的交談!在設定防火牆或者是追蹤網路連線的問題時,這個『雙向』的概念最容易被忽略, 而常常導致無法連線成功的問題啊!切記切記!

    在建立了連線之後,該次連線通道就可以在用戶端與伺服器端建立起一對 socket pair , 然後通過該 socket pair 進行 TCP 封包的 PSH、FIN 等資料傳輸與連線中斷等動作囉!

 

 

 

阅读(873) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~