关于winsock2中的connect函数?
1,只要client收到server的syn+ack,發送ack,client就認為三次握手建立完成,狀態變為Established。阻塞的connect調用成功返回;對于非阻塞的connect調用,都會立馬返回,使用select、poll或者epoll機制來判斷socket是否可寫來判定連接是否建立。
Established狀態下的client自然是可以發送數據給server的。2,如果client的最后一個ack,中途丟失或者被server主動忽略或丟棄,server在定時器溢出后,會重發syn+ack,client向server發送數據,server并不會返回Rst。
要模擬這種場景,有兩種方式:1)收到server的syn+ack后,拔掉客戶端的網線;2)讓server端的accept隊列塞滿,主動丟棄ack。第一種場景模擬起來,難度比較大,于是我們采用第二種。
我采用go寫的server來模擬。將net.core.somaxconn設置為2(因為go中listen調用,傳入的即為系統的上限制),方便模擬。客戶端發送10個connect請求。
測試結果中,反映了下面幾點:
1)客戶端在發送完ack后(13:48:52.999239),立馬(13:48:52.999879)開始發送數據;
2)發送的數據超時后,開始重試;
3)收到服務器重發的syn+ack后,客戶端發送ack;
4)當服務器的syn+ack重試次數超過系統設置值后,斷開連接,發送Rst包給客戶端。結論:客戶端發送完最后一個ack后,就認為連接建立,connect成功!
3,accept成功?這個更簡單了,accept函數調用只是去accept隊列中取出一個連接而已,對服務器而言,只要接收了客戶端的ack(注意,不忽略不拋棄哦),狀態變更為Established了,而不是accept調用成功才變成Established的。
4,tcp的backlog隊列
linux在實現tcp協議棧的時候,采用了兩個隊列,syn和accept隊列。
當接收了對端的syn后,將其放入syn隊列;當接收了對端的ack后,將syn隊列中的連接轉移到accept隊列。5,如果backlog隊列滿了,咋辦?如果服務器端Established了,但突然客戶端斷網了,服務器進入半連接,咋辦?如果客戶端不停的發送syn包咋辦?等等。。。很多問題。。這將會在我的
淺析TCP(上) - 曹東的文章 - 知乎專欄
中篇中詳細介紹,敬請期待!
總結
以上是生活随笔為你收集整理的关于winsock2中的connect函数?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓系统手机中各文件夹的中文意思?
- 下一篇: 牛客网 2018年全国多校算法寒假训练营