建立:
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/
沒有留言:
張貼留言