計(jì)算機(jī)網(wǎng)絡(luò)——理解TCP/IP網(wǎng)絡(luò)協(xié)議棧

1. 網(wǎng)絡(luò)七層模型

網(wǎng)絡(luò)七層模型


image.png
計(jì)網(wǎng)各層協(xié)議.jpg
2. TCP建立連接、斷開連接

SYN包用于初始化包序號(hào),用來解決網(wǎng)絡(luò)包亂序問題。
ACK包用于確認(rèn)收到,用來解決不丟包的問題。

3次握手,4次揮手 圖解

image.png

建立連接
第一次握手
Client將標(biāo)志位SYN置1,隨機(jī)產(chǎn)生一個(gè)值seq=J,并將數(shù)據(jù)包發(fā)給Server
Client進(jìn)入SYN_SENT狀態(tài),等待Server確認(rèn)
第二次握手
Server收到數(shù)據(jù)包后標(biāo)志位SYN=1知道Client請(qǐng)求建立連接,Server將標(biāo)志位SYN和ACK都置1,隨機(jī)產(chǎn)生一個(gè)值,并將數(shù)據(jù)包發(fā)給Client確認(rèn)連接請(qǐng)求,Server進(jìn)入SYN_RCVD狀態(tài)
第三次握手
Client收到確認(rèn)后若ACK為1,則將該數(shù)據(jù)包發(fā)送給Server,Server檢查ACK為1則連接建立成功,Client與Server進(jìn)入ESTABLISHED狀態(tài)完成三次握手,可以傳輸數(shù)據(jù)
其實(shí)也可以理解客戶端還有一次ack,但是這一次直接就發(fā)送數(shù)據(jù)了順帶ack了

image.png

如果第三次握手失敗會(huì)發(fā)生什么?
可以看出當(dāng)失敗時(shí)服務(wù)器并不會(huì)重傳ack報(bào)文,而是直接發(fā)送RTS報(bào)文段,進(jìn)入CLOSED狀態(tài)。這樣做的目的是為了防止SYN洪泛攻擊。詳見
具體參考:https://yuanrengu.com/2020/77eef79f.html
https://www.cnblogs.com/heyonggang/p/3386415.html

斷開連接

image.png

為什么建立連接是三次,斷開連接是4次?
建立連接的時(shí)候服務(wù)端收到客戶端建立連接的請(qǐng)求后,同時(shí)向客戶端發(fā)送了同意建立連接和SYN的包,然后客戶端接收后回復(fù)一次OK,那么TCP的全雙工通道連接就建立了;而在斷開連接的時(shí)候這兩個(gè)通道要分別斷開。因?yàn)檫@兩個(gè)通道是一模一樣的都可以發(fā)送接收,所以要分別斷開。
自己的理解
全雙工可以理解為邏輯上的兩個(gè)通道:A主動(dòng)發(fā)送,B接收和B發(fā)送,A接收兩個(gè),但是實(shí)際都是一個(gè)通信線路,所以當(dāng)A不在主動(dòng)發(fā)送數(shù)據(jù)要關(guān)閉時(shí),就發(fā)起請(qǐng)求,但可能B還要繼續(xù)發(fā)送,連接不能斷開,所以為了不丟包,B也要向A回復(fù)這個(gè)請(qǐng)求關(guān)閉包,這時(shí)就是半關(guān)閉狀態(tài),這已經(jīng)發(fā)送兩個(gè)包了,然后等B也發(fā)送完數(shù)據(jù),在向A發(fā)送一個(gè)請(qǐng)求關(guān)閉包,A回復(fù)確認(rèn),通道完全關(guān)閉,結(jié)束通信,所以是4次

image.png

3. TCP超時(shí)重傳
image.png

image.png

image.png

image.png

image.png
4. TCP滑動(dòng)窗口
image.png

image.png

image.png
5. TCP擁塞控制
image.png

image.png

image.png

image.png

image.png

TCP Nagle算法
nagle算法用于處理小報(bào)文段(微小分組)的發(fā)送問題
nagle算法的核心思想是允許網(wǎng)絡(luò)中最多只能有一個(gè)小分組被發(fā)送,而待發(fā)送的其它小分組會(huì)被重新分組成一個(gè)”較大的”小分組,等收到上一個(gè)小分組的應(yīng)答后再發(fā)送
nagle算法可以減少網(wǎng)絡(luò)中微小分組的數(shù)量,比如客戶端需要依次向服務(wù)器發(fā)送大小為1,2,3,1,2字節(jié)的5個(gè)分組
在沒有開啟nagle算法的情況下,這些小分組會(huì)被依次發(fā)送(不需要等待上一個(gè)小分組的應(yīng)答,因?yàn)闆]啟動(dòng)nagle),總共發(fā)送的報(bào)文段(分組)個(gè)數(shù)為5
當(dāng)開啟nagle算法時(shí),客戶端首先發(fā)送大小為1字節(jié)的第一個(gè)分組,隨后其它分組到達(dá)發(fā)送緩沖區(qū),由于上一個(gè)分組的應(yīng)答還沒有收到,所以TCP會(huì)先緩存新來的這4個(gè)小分組,并將其重新分組,組成一個(gè)大小為8(2+3+1+2)字節(jié)的”較大的”小分組。當(dāng)?shù)谝粋€(gè)小分組的應(yīng)答收到后,客戶端將這個(gè)8字節(jié)的分組發(fā)送??偣舶l(fā)送的報(bào)文段(分組)個(gè)數(shù)為2
當(dāng)傳輸數(shù)據(jù)存在大量交互數(shù)據(jù)時(shí),nagle算法可以有效減少網(wǎng)絡(luò)中的報(bào)文段個(gè)數(shù)

在TCP協(xié)議: 累積確認(rèn) 和 捎帶確認(rèn)
累積確認(rèn)
有時(shí)候,發(fā)送方發(fā)送速度非???,接收方一下下接收到了好幾個(gè) tcp 段,可以通過累積確認(rèn)的方式,一次確認(rèn)好幾個(gè) tcp 段,這樣減少報(bào)文段的傳輸。
捎帶確認(rèn)
有時(shí)候,雙方互相發(fā)送數(shù)據(jù),當(dāng)接收到對(duì)方的 tcp 段后,先不著急確認(rèn),而是等待一會(huì)兒,連同數(shù)據(jù)和 ack 一起發(fā)送過去,這種情況叫捎帶確認(rèn)。如果等了一會(huì)兒(到時(shí)間了),接收方還沒有數(shù)據(jù)要發(fā)送,那就直接回復(fù)一個(gè)純 ack 過去,這樣的 ack 稱為延時(shí)的 ack(Delayed ACK)。
如果沒有上述情況發(fā)生,ack延遲會(huì)等待多久發(fā)送呢?在linux上,所有的延時(shí)的 ack,延時(shí)時(shí)間都在 40 ms 左右(從收到數(shù)據(jù)到發(fā)送 ack 之間的時(shí)間)。
有沒有禁止的延遲確認(rèn)的方法,畢竟在實(shí)時(shí)性很高的場(chǎng)景,我們還是希望ack不要延遲的。有,tcp TCP_QUICKACK選項(xiàng),不過好像這個(gè)選項(xiàng)的資料不是很多,貌似是一個(gè)附加選項(xiàng)。
我們看到TCP_NODELAY是針對(duì)Nagle算法的,而不是延遲確認(rèn),不要被字面意思誤導(dǎo)。

理解TCP/IP網(wǎng)絡(luò)協(xié)議棧,發(fā)送數(shù)據(jù),接收數(shù)據(jù)詳細(xì)流程

Understanding TCP/IP Network Stack
The Send Case

image

The Steps for Sending a Single Ethernet Frame

  1. The host operating system is informed that a frame is in host memory and is ready to be sent. The OS builds a buffer descriptor regarding this frame in host memory.
  2. The OS notifies the NIC that a new buffer descriptor is in host memory and is ready to be fetched and processed. This is typically referred to as a "mailbox" event.
  3. The NIC initiates a direct memory access (DMA) read of the pending buffer descriptor and processes it.
  4. Having determined the host address of the pending frame, the NIC initiates a DMA read of the frame contents.
  5. When the all segments of the frame (which may use several buffer descriptors and buffers) have arrived, the NIC transmits the frame out onto the Ethernet.
  6. Depending on how the OS has configured the NIC, the NIC may interrupt the host to indicate that the frame has completed.

The Receive Case

image

The Steps for Receiving a Single Ethernet Frame

For these steps, it's presumed that the OS has already created buffer descriptors that point to free regions in host memory and that the NIC has read these buffer descriptors into local NIC memory via DMA.

  1. The NIC receives a frame from the network into its local receive buffer.
  2. Presuming there is enough host memory available for this received frame, the NIC initiates a DMA write of the frame contents into host memory. The NIC determines what the starting host address is by examining the next free buffer descriptor (which it has previously fetched).
  3. The NIC modifies the previously fetched buffer descriptor regarding the space that the new frame now occupies; the NIC fills in the frame length and possibly checksum information. After modifying this buffer descriptor, the NIC initiates a DMA write of it to the host.
  4. Depending on how the OS has configured the NIC, the NIC may interrupt the host to indicate that a frame has arrived.
6. 網(wǎng)絡(luò)IO模型

IO有兩種操作,同步IO和異步IO。同步IO指的是,必須等待IO操作完成后,控制權(quán)才返回給用戶進(jìn)程。異步IO指的是,無需等待IO操作完成,就將控制權(quán)返回給用戶進(jìn)程。

4種網(wǎng)絡(luò)IO模型
阻塞和非阻塞的區(qū)別?
阻塞和非阻塞描述的是用戶線程調(diào)用內(nèi)核IO操作的方式:阻塞是指IO操作需要徹底完成后才返回到用戶空間;而非阻塞是指IO操作被調(diào)用后立即返回給用戶一個(gè)狀態(tài)值,不需要等到IO操作徹底完成。

阻塞IO模型

image.png

非阻塞IO模型
image.png

多路復(fù)用IO模型
image.png

異步IO模型
image.png

對(duì)比
image.png

非阻塞IO和異步IO的區(qū)別
非阻塞IO,雖然進(jìn)程大部分時(shí)間都不會(huì)被阻塞,但它仍然要求進(jìn)程去主動(dòng)檢查,并且當(dāng)數(shù)據(jù)準(zhǔn)備完成以后,也需要進(jìn)程主動(dòng)地再次調(diào)用recvfrom來將數(shù)據(jù)拷貝到用戶內(nèi)存中。而異步IO則完全不同,他就像是用戶進(jìn)程將整個(gè)IO操作交給內(nèi)核完成,然后內(nèi)核做完后發(fā)信號(hào)通知。在此期間,用戶進(jìn)程不需要檢查IO操作的狀態(tài),也不需要主動(dòng)地拷貝數(shù)據(jù)。
epoll,poll和select的區(qū)別
image.png

image.png

7. 網(wǎng)絡(luò)分析工具

四個(gè)網(wǎng)絡(luò)分析工具:ping、tcpdump、netstat和lsof
ping

ping 會(huì)發(fā)送一個(gè)icmp(因特網(wǎng)信報(bào)控制協(xié)議),用來檢查網(wǎng)絡(luò)是否通暢或者網(wǎng)絡(luò)連接速度的命令。
ping檢查的六個(gè)步驟
1)使用ipconfig/all觀察本地網(wǎng)絡(luò)設(shè)置是否正確。
2)ping 127.0.0.1,來檢查本地的TCP/IP協(xié)議有沒有設(shè)置好;
3)ping本機(jī)IP地址,檢查本機(jī)IP地址是否設(shè)置有誤
4)ping本網(wǎng)網(wǎng)關(guān)或者IP地址,檢查硬件設(shè)備是否有問題,也可以檢查本機(jī)和本地網(wǎng)絡(luò)連接是否正常
5)ping本地DNS地址,這樣做是為了檢查本地DNS服務(wù)器是否正常工作
6)ping遠(yuǎn)程IP地址,檢查本網(wǎng)或本機(jī)與外部的鏈接是否正常。

tcpdump
tcpdump可以將網(wǎng)絡(luò)中傳送的數(shù)據(jù)包的“頭”完全截獲下來提供分析。它支持針對(duì)協(xié)議、主機(jī)、網(wǎng)絡(luò)或端口的過濾,并提供and、or、not等邏輯語句進(jìn)行篩選。

tcpdump [-adeflnNOpqStvx]  [-c 數(shù)量]  [-F 文件名]
               [-i 網(wǎng)絡(luò)接口]  [-r 文件名]  [-s 
 snaplen]
               [-T  類型]  [-w 文件名]  [表達(dá)式]

表達(dá)式是一個(gè)正則表達(dá)式,表達(dá)式中一般包含幾個(gè)關(guān)鍵字,如下:

1)關(guān)于類型的關(guān)鍵字,主要包括host、net、port等,例如host 127.0.0.1即指明這是一個(gè)主機(jī),net 202.0.0.0指明202.0.0.0是一個(gè)網(wǎng)絡(luò)地址,port 23指明端口號(hào)是23;默認(rèn)是host。
2)確定傳輸方向的關(guān)鍵字,主要包括src、dst、dst or src等;
3)協(xié)議的關(guān)鍵字,主要包括fddi、ip、arp、rarp、tcp、udp等類型。
除了這3種類型的關(guān)鍵字之外,還有g(shù)ateway、broadcast、less、greater等,還有三種邏輯運(yùn)算:取非運(yùn)算not/!,與運(yùn)算and/&&,或運(yùn)算or/||。

netstat
用于顯示與IP、TCP、UDP和ICMP協(xié)議相關(guān)的統(tǒng)計(jì)數(shù)據(jù),一般用于檢驗(yàn)本機(jī)各端口的網(wǎng)絡(luò)連接情況。netstat是在內(nèi)核中訪問網(wǎng)絡(luò)及相關(guān)信息的程序,它能提供TCP連接、對(duì)TCPhenomenonUDP的監(jiān)聽及獲取進(jìn)程內(nèi)存管理的相關(guān)報(bào)告。

image.png

lsof
losf(list open file)是一個(gè)列出當(dāng)前系統(tǒng)打開文件的工具。

image.png

lsof各列信息的意義如下
1)COMMAND:進(jìn)程的名稱
2)PID:進(jìn)程標(biāo)識(shí)符
3)USER:進(jìn)程所有者
4)FD:文件描述符
5)TYPE:文件類型
6)DEVICE:指定磁盤的名稱
7)SIZE:文件的大小
8)NODE:索引節(jié)點(diǎn)
9)NAME:打開文件的確切名稱
image.png

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容