日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

TCP:SEQ号与ACK号

發布時間:2025/4/5 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TCP:SEQ号与ACK号 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

三次握手Three-way Handshake

一個虛擬連接的建立是通過三次握手來實現的

1. (B) –> [SYN] –> (A)

假如服務器A和客戶機B通訊. 當A要和B通信時,B首先向A發一個SYN (Synchronize) 標記的包,告訴A請求建立連接.

注意: 一個 SYN包就是僅SYN標記設為1的TCP包(參見TCP包頭Resources). 認識到這點很重要,只有當A受到B發來的SYN包,才可建立連接,除此之外別無他法。因此,如果你的防火墻丟棄所有的發往外網接口的SYN包,那么你將不能讓外部任何主機主動建立連接。

2. (B) <– [SYN/ACK] <–(A)

接著,A收到后會發一個對SYN包的確認包(SYN/ACK)回去,表示對第一個SYN包的確認,并繼續握手操作.

注意: SYN/ACK包是僅SYN 和 ACK 標記為1的包.

3. (B) –> [ACK] –> (A)

B收到SYN/ACK 包,B發一個確認包(ACK),通知A連接已建立。至此,三次握手完成,一個TCP連接完成

Note: ACK包就是僅ACK 標記設為1的TCP包. 需要注意的是當三此握手完成、連接建立以后,TCP連接的每個包都會設置ACK位

握手階段:
序號 ???方向 ????????seq ??????????ack
1  ??A->B ????????0 ??????????????0
2 ????????B->A ????????0 ??????????????0+1=1
3 ????????A->B ????????1 ??????????????0+1=1
解釋:
1:A向B發起連接請求,以一個隨機數初始化A的seq,這里假設為0,此時ACK標記為0,也就是如果抓包的話是看不到ack標記的。

2:B收到A的連接請求后,也以一個隨機數初始化B的seq,這里假設為0,意思是:你的請求我已收到,我這方的數據流就從這個數開始。B的ACK是A的seq加1,即0+1=1

3:A收到B的回復后,它的seq是它的上個請求的seq加1,即0+1=1,意思也是:你的回復我收到了,我這方的數據流就從這個數開始。A此時的ACK是B的seq加1,即0+1=1

數據傳輸階段:
序號  ???????方向    ????seq ????????????ack ????????????????????????????????????size
23 ????????????????A->B ???????????????40000 ????????70000 ????????????????????????????????1514
24 ????????????????B->A ???????????????70000 ????????40000+1514-54=41460 ????54
25 ????????????????A->B ???????????????41460 ????????70000+54-54=70000 ????????1514
26 ????????????????B->A ???????????????70000 ????????41460+1514-54=42920 ????54
解釋:
23:B接收到A發來的seq=40000,ack=70000,size=1514的數據包。
24:于是B向A也發一個數據包,告訴A,你的上個包我收到了。B的seq就以它收到的數據包的ACK填充,ACK是它收到的數據包的SEQ加上數據包的大小(不包括以太網協議頭,IP頭,TCP頭),以證實B發過來的數據全收到了。
25:A在收到B發過來的ack為41460的數據包時,一看到41460,正好是它的上個數據包的seq加上包(應用層純數據)的大小,就明白,上次發送的數據包已安全到達。于是它再發一個數據包給B。這個正在發送的數據包的seq也以它收到的數據包的ACK填充,ACK就以它收到的數據包的seq(70000)加上包的size(54)填充,即ack=70000+54-54(全是頭長,沒數據項)。

其實,在握手和結束時確認號應該是對方序列號加1,傳輸數據時則是對方序列號加上對方攜帶應用層數據的長度。如果從以太網包返回來計算所加的長度,就嫌走彎路了。
另外,如果對方沒有數據過來,則自己的確認號不變,序列號為上次的序列號加上本次應用層數據發送長度。

TCP的SEQ和ACK總結:??????

???????在TCP通訊中,無論是建立連接,數據傳輸,友好斷開,強制斷開,都離不開Seq值和Ack值,它們是TCP傳輸的可靠保證。Seq是發送方告訴接收方,我當前從第Seq個字節開始發送len個字節數據(不包括以太網Eth頭,IP頭和Tcp頭,也就是純數據長度)給你,而Ack則是接收方給發送方回復:接收方回復的Ack=發送方Seq+發送數據長度len。
??????在建立連接雙方握手時,發送方的Seq為0,表示發送的數據長度也為0,這時接收方收到數據幀后,會判斷Seq+數據長度為0或者Seq+數據長度為1的話,那么在回應發送方的Ack的值就為1(也就表示確認號有效,為0的話就表示數據包中不包含確認信息(即不含有Ack字段),忽略確認號字段)。
??????在數據傳輸中,如果Seq+數據長度不為0或1并且數據長度不為0的話,則回應時的Ack就等于Seq+數據長度的值,這就表示我已經收到Seq+數據長度個字節的數據。發送方收到該Ack就會比較自己的Seq+剛發出去的純數據長度,如果一致,則回應接收方的Ack,并且發送下一個包,否則將重發該包,若超時還沒收到Ack也會重發該包。
————————————————
版權聲明:本文為CSDN博主「ByteBai」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/bytebai/article/details/21752925

總結

以上是生活随笔為你收集整理的TCP:SEQ号与ACK号的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。