TCP/IP 学习 --- 2
1 上圖為tcp和udp協(xié)議格式
2 tcp有發(fā)送和接收緩沖區(qū),每次發(fā)送多少字節(jié)和讀取多少字節(jié),沒(méi)有固定量,根據(jù)mss,tcp自動(dòng)進(jìn)行分發(fā)報(bào)文。但是udp不同,每一個(gè)發(fā)送操作對(duì)應(yīng)一個(gè)讀操作,否則會(huì)丟包。
3 序號(hào)值會(huì)被系統(tǒng)初始化為一個(gè)隨機(jī)值isn,那么在該方向上發(fā)送的消息的序號(hào)值時(shí)該tcp報(bào)文段數(shù)據(jù)部分第一個(gè)字節(jié)相對(duì)于整個(gè)字節(jié)流頭部的偏移量加上這個(gè)isn值,例如某個(gè)tcp報(bào)文段的數(shù)據(jù)是第1025-2048字節(jié),那么其序號(hào)值為isn+1025。確認(rèn)號(hào)為序列號(hào)+1
4 URG標(biāo)志位表示緊急指針是否有效。ACK標(biāo)志位表示確認(rèn)號(hào)是否有效。PSH標(biāo)志位表示接收端應(yīng)用程序應(yīng)立即從TCP緩沖區(qū)中讀走數(shù)據(jù)(一般來(lái)說(shuō),每一次 write,都會(huì)將這一次的數(shù)據(jù)打包成一個(gè)或多個(gè) TCP 報(bào)文段(如果數(shù)據(jù)量大于 MSS 的話(huà),就會(huì)被打包成多個(gè) TCP 段),并將最后一個(gè) TCP 報(bào)文段標(biāo)記為 PSH)表示一個(gè)完整的消息包結(jié)束。只要接收方的緩沖區(qū)沒(méi)有滿(mǎn),就會(huì)一直等待,直到接收到一個(gè)帶有PSH標(biāo)志的報(bào)文,read才回返回。RST標(biāo)志表示要求對(duì)方重新建立連接。SYN標(biāo)志表示請(qǐng)求建立一個(gè)連接。FIN標(biāo)志表示通知對(duì)方本端即將關(guān)閉。
5 如果A端向B端發(fā)送SYN,當(dāng)時(shí)沒(méi)有收到B端回復(fù),A端會(huì)發(fā)送6個(gè)序號(hào)一致的同步報(bào)文段,其間隔為1S、2s、4s、8s、16s、32s。指數(shù)增長(zhǎng)。
6?
7 tcp出現(xiàn)連接時(shí)的四次握手狀況:
當(dāng)TCP連接雙方幾乎同時(shí)向?qū)Ψ桨l(fā)送SYN同步報(bào)文段請(qǐng)求連接,隨后進(jìn)入到SYN_SEND狀態(tài)。接到對(duì)方的SYN后進(jìn)入SYN_RCVD狀態(tài)各自返回一個(gè)ACK。雙方收到對(duì)方的ACK進(jìn)入ESTABLISHED。同時(shí)打開(kāi)的時(shí)候沒(méi)有服務(wù)器和客戶(hù)端的概念,并且一共會(huì)發(fā)送4個(gè)報(bào)文段,而不是正常三次握手中的3個(gè)
8?當(dāng)客戶(hù)端發(fā)送ACK給服務(wù)器端后要進(jìn)入2MSL的TIME_WAIT時(shí)間,MSL是報(bào)文段最大生存時(shí)間,RFC1122中定義這個(gè)時(shí)間一般為2min。等待這端時(shí)間的目的是防止由于網(wǎng)絡(luò)原因服務(wù)器端未收到這個(gè)ACK回復(fù),重傳了上一個(gè)FIN報(bào)文段,如果不進(jìn)入TIME_WAIT狀態(tài)則服務(wù)器端一旦接收不到ACK,就會(huì)維持連接,消耗內(nèi)核資源。所以在實(shí)際編程過(guò)程中,我們會(huì)經(jīng)常發(fā)現(xiàn)多次測(cè)試重復(fù)綁定socket的時(shí)候會(huì)出現(xiàn)端口被占用的錯(cuò)誤,這就是端口仍處于TIME_WAIT狀態(tài)不能被使用,可用socket選項(xiàng)SO_REUSEADDR來(lái)強(qiáng)制立即使用端口。
9?TCP發(fā)送攜帶RST標(biāo)志的復(fù)位報(bào)文段以通知對(duì)方關(guān)閉連接或重新建立連接。一般有三種情況:1)訪問(wèn)不存在的端口,這點(diǎn)在上面的①中已經(jīng)說(shuō)明;2)異常中止連接,當(dāng)一方向另一方發(fā)送復(fù)位報(bào)文段時(shí),發(fā)送端所有排隊(duì)等待發(fā)送的數(shù)據(jù)皆被丟棄,在編程過(guò)程中,可以使用socket選項(xiàng)的SO_LINGER來(lái)發(fā)送復(fù)位報(bào)文段以異常終止一個(gè)連接;3)處理半打開(kāi)連接,當(dāng)通信雙方建立連接后,若其中一方網(wǎng)絡(luò)斷線,而另一方此時(shí)并不知情,此時(shí)斷線方網(wǎng)絡(luò)重連,沒(méi)有了該連接的信息,即處于了半打開(kāi)狀態(tài),另一方繼續(xù)向?qū)Ψ桨l(fā)送數(shù)據(jù),此時(shí)由于對(duì)面連接已經(jīng)被關(guān)閉,所以對(duì)方會(huì)返回一個(gè)復(fù)位報(bào)文段以重新連接。
10 發(fā)現(xiàn)網(wǎng)絡(luò)擁塞的依據(jù):1、傳輸超時(shí) 2、收到兩個(gè)重復(fù)的確認(rèn)報(bào)文段。
轉(zhuǎn)載于:https://www.cnblogs.com/zanyouxin/p/9203842.html
總結(jié)
以上是生活随笔為你收集整理的TCP/IP 学习 --- 2的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: StringToInt
- 下一篇: dede标签用法(来源网页)