iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 13
1

TCP header的封包較為複雜,且TCP有保證可靠傳輸的機制,所以花兩小節來講,第一小節先講理論,TCP是怎麼保證可靠傳輸、壅塞控制等等。

TCP是基於bytes stream的協議,意思是為了保證不發生丟包,就給每個包一個序號,同時序號也保證了傳送到接收端實體的包的按序接收。然後接收端實體對已成功收到的包發回一個相應的確認信息(ACK);如果發送端實體在合理的往返時延(RTT)內未收到確認,那麼對應的數據包就被假設為已丟失並進行重傳。

UDP只管傳出去就對了,TCP比較複雜,有三個階段,分別為連接創建,封包傳輸和連接終止

  • 連接創建:用三方交握創建一個可靠連接
  1. Client向Server送一個SYN讓Server打開socket,作為三方交握的一部分。Client把這段連接的序號設定為隨機數A。
  2. Server應當為一個合法的SYN回送一個SYN和ACK。ACK的確認碼應為A+1,SYN和ACK包本身又有一個隨機產生的序號B。
  3. 最後,Client再發送一個ACK。此時封包的序號被設定為A+1,而ACK的確認碼則為B+1。當Server收到這個ACK的時候,就完成了三方交握,並進入了連接創建狀態。

為什麼要三次交握呢?設想一下當你打電話給朋友,剛接通的瞬間就是要確認連結

A: 喂,有聽到我的聲音嗎?
B: 有,那你有聽到我的聲音嗎?
A: 有,….(開始聊天)
  • 封包傳輸:TCP在封包傳輸上有壅塞控制和滿開始的機制,一開始不會一次發大量的封包,而是少少的發,越來越多,之道能塞滿頻寬,並且會對每次的封包加一個序號,使用ACK來判定是否為同個connection,如果封包掉了會重傳,Server收到封包後也會通知client收到了,否則client會重傳

  • 連接終止:用四向揮手終止連接

  1. Client對server發出FIN和ACK,說client已經發出最後一個封包了
  2. Server收到FIN,會回傳ACK,通知Client我收到了,我把剩下的傳完
  3. 傳完之後,Server發送FIN,和Client說你可以關閉連接了
  4. Client關閉了連接,對Server發出ACK,Server收到ACK後也關閉連接

下一篇,我們會對TCP的header解碼並且print出來,看連結的建立、封包的傳輸、連結的終止過程

系列的成果將會放在這:https://github.com/kaichiachen/pytcpdump
文章配合著程式碼有助於學習 :)


上一篇
Day12 解析第四層-UDP的封包結構
下一篇
Day14 解析第四層-TCP的封包結構(2)
系列文
那些年還給老師的TCP/IP五層結構 - 用Python進行網路封包分析30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言