2016年8月5日 星期五

TCP 連線建立/斷開 與sequence number 與 selective ack(SACK)



建立:

Host A

Host B
1
SYN
->

2

<-
ACK
3

<-
SYN
4
ACK
->


        Step 2 and 3可以合併,共三行,所以叫做3-way handshake

Host A

Host B
1
SYN
->

2

<-
ACK, SYN
3
ACK
->



斷開:
由於TCP是雙向的,所以TX/RX方向都要送出FIN通知要結束


Host A

Host B
1
FIN
->

2

<-
ACK
3

<-
FIN
4
ACK
->


selective ack(SACK)
  • linux 可控制SACK 是否開啟: /proc/sys/net/ipv4/tcp_sack
  • 這邊說的server指傳送端,client指接收端
  • 由於TCP 原本ack 機制,client發現有掉了一個封包後(某個封包漏掉,但之後的有收到),會重送最後有收到封包的ACK,server 在收到這個ACK,得知掉封包時,又會從少掉的那個重送
  • 可以發現在server 知道掉包時,已經過一段時間,在這中間server 送出的封包,可能部分client還是有收到,但原本的機制會忽略掉這些部分,造成浪費
  • SACK機制可以讓client 通知server 雖然有掉封包,但是後面的某部分有收到,所以可以不用重送
    • 在原本機制中client重送最後收到封包的ACK 內,再帶SACK 欄位標明那些資料區段有收到,讓server避免重送已收到的封包

參考
http://packetlife.net/blog/2010/jun/7/understanding-tcp-sequence-acknowledgment-numbers/
http://packetlife.net/blog/2010/jun/17/tcp-selective-acknowledgments-sack/

沒有留言:

張貼留言