1--Timewait狀態(tài)
? ? ? ? 對于服務(wù)器端/客戶端,當一端結(jié)束連接時,會向另一端發(fā)送 FIN 消息;兩端的在經(jīng)過四次揮手過程后,其 Socket 不會馬上消除,而是會處于一個 Time-wait 狀態(tài)的階段,此時 Socket 擁有的端口號并沒有得到釋放,因此不能使用相同的端口號;
? ? ? ? 只有先斷開連接的(先發(fā)送 FIN 消息)的主機才會經(jīng)過 Time-wait 狀態(tài);
? ? ? ? 通過 setsockopt() 函數(shù)來更改 SO_REUSEADDR 的狀態(tài)(設(shè)置為TRUE)可以將處于 Time-wait 狀態(tài)的 Socket?端口號重新分配給新的 Socket,具體代碼參考:代碼實例
為什么需要 timewait 狀態(tài)?
? ? ? ? ① 對于上圖,當客戶端主動斷開連接,進行四次揮手時,客戶端會進入一個 timewait 狀態(tài),這個狀態(tài)可以確??蛻舳?strong>最后一次發(fā)送的?ACK 信息報可以順利到達服務(wù)器端;
????????因為最后一次發(fā)送的 ACK 信息報可能會在傳輸過程中丟失,導致服務(wù)器端無法順利關(guān)閉連接;這時服務(wù)器端就會以為它第三次揮手傳送的 FIN 信息報沒有送達客戶端,就會啟動超時重傳 FIN 信息報;但如果客戶端直接關(guān)閉了,就會造成永遠收不到服務(wù)器端超時重傳的 FIN 信息報(其實會收到的,但由于客戶端關(guān)閉了,就會將收到的信息報認為是非法信息報,從而返回一個 RST 信息報),同時也無法重新發(fā)送最后一次揮手的 ACK 信息報,從而造成異常。
????????同理,服務(wù)器端不斷超時重傳 FIN 信息報,但一直無法收到 ACK 信息報(只會收到客戶端發(fā)送過來的 RST 信息報),就會無法順利地 close;
? ? ? ? ②?在第四次揮手后,經(jīng)過 2msl 的 timewait 時間足以讓本次連接產(chǎn)生的所有報文段都從網(wǎng)絡(luò)中消失,這樣下一次新的連接中就肯定不會出現(xiàn)舊連接的報文段了;
2--Nagle算法
? ? ? ? Nagle 算法可以防止數(shù)據(jù)包過多而導致的網(wǎng)絡(luò)過載問題,其應(yīng)用于 TCP 層;
? ? ? ? Nagle 算法規(guī)定:只有收到前一數(shù)據(jù)的 ACK 消息時,Nagle 算法才會發(fā)送下一數(shù)據(jù);文章來源:http://www.zghlxwxcb.cn/news/detail-706251.html
? ? ? ? 一般情況下,不使用 Nagle 算法可以提高傳輸速度,當傳輸大文件時可以禁用 Nagle 算法,通過 setsockopt() 函數(shù)來設(shè)置 TCP_NODELAY 為 True 來禁用 Nagle 算法;文章來源地址http://www.zghlxwxcb.cn/news/detail-706251.html
// 禁用 Nagle 算法
int opt_val = 1;
setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (void*)&opt_val, sizeof(opt_val));
// 查看 Nagle 狀態(tài)
int opt_val;
socklen_t opt_len;
opt_len = sizeof(opt_val);
getsockopt(sock, IPPROTO_TCP, TCP_NPDELAY, (void*) &opt_val, &opt_len);
到了這里,關(guān)于《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--Timewait狀態(tài)和Nagle算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!