這是博客的第一篇文章,目的有三個:
- 爭對面試中的常見問題做一個系統的總結,徹底搞懂面試中的相關問題;
- TCP 協議是一個復雜的協議,作為第一個主題,能夠言之有物;
- 當然最重要的還是希望學習到知識,解決模棱兩可的問題;
TCP 協議是什么
首先,我們需要知道TCP在網路OSI的七層模型中的第四層——Transport層,IP在第三層——Network層,ARP在第二層——Data Link層,在第二層上的資料,我們叫Frame,在第三層上的資料叫Packet,第四層的資料叫Segment,
程式的資料首先會打到TCP的Segment中,然后TCP的Segment會打到IP的Packet中,然后再打到以太網Ethernet的Frame中,傳到對端后,各個層決議自己的協議,然后把資料交給更高層的協議處理,
我們可以使用tcpdump抓包查看一個TCP資料包
hiro@zen:~$ sudo tcpdump -i ens160 port 22 -e -XX -c 10 -v
tcpdump: listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
10:21:06.178852 00:50:56:b6:9e:17 (oui Unknown) > 00:50:56:b6:fa:ff (oui Unknown), ethertype IPv4 (0x0800), length 210: (tos 0x10, ttl 64, id 63496, offset 0, flags [DF], proto TCP (6), length 196)
192.168.71.165.ssh > 192.168.71.174.43516: Flags [P.], cksum 0x115b (incorrect -> 0x0012), seq 3793411968:3793412112, ack 471062190, win 322, options [nop,nop,TS val 1042614901 ecr 1042627494], length 144
0x0000: 0050 56b6 faff 0050 56b6 9e17 0800 4510 .PV....PV.....E.
0x0010: 00c4 f808 4000 4006 3177 c0a8 47a5 c0a8 ....@[email protected]...
0x0020: 47ae 0016 a9fc e21a df80 1c13 d6ae 8018 G...............
0x0030: 0142 115b 0000 0101 080a 3e25 0a75 3e25 .B.[......>%.u>%
0x0040: 3ba6 25ea 9f26 818e a6fb 2198 351a f50e ;.%..&....!.5...
0x0050: 50c7 6069 7398 7d97 aded 82f3 8219 feb2 P.`is.}.........
0x0060: dc40 12fa aa07 09f1 49be 3e39 db7c a668 [email protected].>9.|.h
0x0070: 2648 ca9a 2215 f24a 939b 0965 72db 4850 &H.."..J...er.HP
0x0080: 06d8 5c30 dbdf 67f8 ce9b ddc2 30d4 692b ..\0..g.....0.i+
0x0090: f42c 1f1b 9f52 1b08 f97a 60dd ff2b 0f14 .,...R...z`..+..
0x00a0: 01e4 946a a1b3 d2c8 3d37 0af3 5699 6113 ...j....=7..V.a.
0x00b0: 6bf1 20a8 39c7 4ef7 8f56 6538 255f 7584 k...9.N..Ve8%_u.
0x00c0: 4b08 b2b5 0aaf 6c43 da6b acda 1b03 5ddd K.....lC.k....].
0x00d0: 63ae c.
10:21:06.178978 00:50:56:b6:fa:ff (oui Unknown) > 00:50:56:b6:9e:17 (oui Unknown), ethertype IPv4 (0x0800), length 66: (tos 0x0, ttl 64, id 57334, offset 0, flags [DF], proto TCP (6), length 52)
192.168.71.174.43516 > 192.168.71.165.ssh: Flags [.], cksum 0x2f54 (correct), ack 144, win 5458, options [nop,nop,TS val 1042627507 ecr 1042614901], length 0
0x0000: 0050 56b6 9e17 0050 56b6 faff 0800 4500 .PV....PV.....E.
0x0010: 0034 dff6 4000 4006 4a29 c0a8 47ae c0a8 .4..@[email protected])..G...
0x0020: 47a5 a9fc 0016 1c13 d6ae e21a e010 8010 G...............
0x0030: 1552 2f54 0000 0101 080a 3e25 3bb3 3e25 .R/T......>%;.>%
0x0040: 0a75 .u

TCP 的狀態機
網路上的傳輸是沒有連接的,包括TCP也一樣,所謂的TCP連接,其實是通訊雙方共同維護的一個連接狀態,讓上層看起來像是有連接一樣,實作連接狀態的基礎就是TCP協議狀態機.

一個經典的問題出現了,為什么建立連接需要3次握手,斷開連接需要4次握手?
對于建鏈接的3次握手:主要是要初始化
Sequence Number的初始值,通信的雙方要互相通知對方自己的初始化的Sequence Number(縮寫為ISN:Inital Sequence Number)——所以叫SYN,全稱Synchronize Sequence Numbers,也就上圖中的x和y,這個號要作為以后的資料通信的序號,以保證應用層接收到的資料不會因為網路上的傳輸的問題而亂序(TCP會用這個序號來拼接資料),對于4次揮手:其實你仔細看是2次,因為
TCP是全雙工的,所以,發送方和接收方都需要Fin和Ack,只不過,有一方是被動的,所以看上去就成了所謂的4次揮手,如果兩邊同時斷連接,那就會就進入到CLOSING狀態,然后到達TIME_WAIT狀態,
TCP 重傳機制
TODO
流量控制
TODO
擁塞控制
TODO
Reference
- [通俗易懂]深入理解TCP協議(上):理論基礎
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/71742.html
標籤:其他
