在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

tcp網絡協議棧的三個階段包括哪些

OSC開源社區 ? 來源:OSC開源社區 ? 2023-08-08 10:18 ? 次閱讀

一、TCP 網絡開發 API

TCP,全稱傳輸控制協議(Transmission Control Protocol),是一種面向連接的、可靠的、基于字節流的傳輸層通信協議。

1.1、TCP 服務器調用的 API

#include  /* See NOTES */

#include 

// 1

int socket(int domain, int type, int protocol);

// 2

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

// 3

int listen(int sockfd, int backlog);

// 4

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

// 5

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

// 6

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

// 7

int close(int fd);

// 8

int shutdown(int sockfd, int how);

1.2、TCP 客戶端調用的 API

#include  /* See NOTES */

#include 

// 1

int socket(int domain, int type, int protocol);

// 2

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

// 3

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

// 4

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

// 5

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

// 6

int close(int fd);

// 7

int shutdown(int sockfd, int how);

1.3、API 函數的作用

(1)int socket(int domain, int type, int protocol) 在文件系統中分配一個 fd,并創建 TCB 數據結構。 (2)int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen) 為 TCP 的 socket 綁定本地 IP 地址和端口。 (3)int listen(int sockfd, int backlog) 將 TCP 置于 LISTEN 狀態。 (4)int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) 從全連接隊列中取出一個節點,并分配一個 fd。 (5)ssize_t recv(int sockfd, void *buf, size_t len, int flags) 在對應 fd 中,從讀緩沖區中拷貝出數據。 (6)ssize_t send(int sockfd, const void *buf, size_t len, int flags) 把 fd 對應的 TCB 數據拷貝到寫緩沖區中。 (7)int close(int fd) 準備一個 FIN 包,放到寫緩沖區,是否 fd。 (8)int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen) 準備一個 SYN 包,交給協議棧發送出去,等待三次握手完成后才返回。

二、TCP 的三個階段

2.1 TCP 建立連接

TCP 連接的建立主要依靠 socket ()、bind ()、listen ()、connect ()、accept () 這幾個函數。

2.1.1、TCP 的三次握手

示意圖: 6bbf60ae-3514-11ee-9e74-dac502259ad0.png 三次握手在 kernel 協議棧中進行,那么三次握手是在哪幾個函數中發送的呢? 第一次,由 connect () 函數觸發 發起握手,也就是發送 syn 包到服務端; 第二次,在 listen () 之后 accept () 之前,服務器接收到 syn 包后發送 syn&&ack 包到客戶端; 第三次,客戶端發送 ack 包到服務端完成連接的建立。 TCP 報頭:

0 |1 |2 |3

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

+-------------------------------+-------------------------------+

| Source Port | Destination Port |

+---------------------------------------------------------------+

| Sequence Number |

+---------------------------------------------------------------+

| Acknowledgment Number |

+-------+-----------+-+-+-+-+-+-+-------------------------------+

| Header| Reserve |U|A|P|R|S|F| Window |

| Length| |R|C|S|S|Y|I| |

| | |G|K|H|T|N|N| |

+-------------------------------+-------------------------------+

| Checksum | Urgent Pointer |

+---------------------------------------------------------------+

| Option |

+---------------------------------------------------------------+

| Data |

| ... |

+---------------------------------------------------------------+

SYN:即 synchronous,同步。

ACK:即 acknowledgement,確認。

PSH:即 push,推送。

FIN :即 finish,結束。

RST:即 reset,重置。

URG:即 urgent,緊急。

Sequence Number:是數據包本身第一個字節的序列號。

Acknowledge Number:是期望對方繼續發送的那個確認數據包的序列號其值一般為接收到的 Sequence Number 加 1。

從報文中可以看出,SYN 包最重要的是將 SYN 位設為 1,設置 Sequence Number;ACK 包最重要的是將 ACK 位設為 1,設置 Acknowledgment Number。 半連接隊列和全連接隊列: 在三次握手中,Linux kener 協議棧會維護兩個隊列:半連接隊列和全連接隊列。 半連接隊列(也叫 SYN 隊列):半連接隊列在第一握手中,當客戶端發送 SYN 包到服務端時,服務端的半連接隊列會加入一個節點,表示此連接處于半連接狀態。 全連接隊列(也叫 ACCEPT 隊列):全連接隊列在第三握手中,當客戶端發送 ACK 包到服務端時,服務端會檢查半連接隊列中是否存在此連接節點(通過五元組進行查找),如果存在就將此連接節點加入全連接隊列中;否則將拋棄此連接。 accpt () 函數在三次握手完成后,從全連接隊列中取出連接節點,為節點分配 socket fd,返回到用戶態。 那么,accept () 函數如何知道全連接隊列中有節點呢? 當三次握手完成后,全連接隊列創建節點的同時會釋放一個有連接接入的信號(single 或信號量),這個信號決定了 accept () 函數是否可以從全連接隊列中取節點;也決定 epoll 等 IO 多路復用器能不能檢查這個連接 fd 是否可讀。 在阻塞模式下,accept () 函數一直等待信號,直到全連接隊列中有節點才返回。 在非阻塞模式下,全連接隊列為空 accept () 函數就返回 - 1,否則返回 socket fd。 在 listen () 函數有,有一個 backlog 參數,這個參數表示的是全連接隊列的大小還是半連接隊列的大小呢? 隨著 TCP 協議的不斷迭代,backlog 參數在不同的版本中代表的含義也不相同;它可以是半連接隊列大小,也可以是全連接隊列大小,也可以是半連接隊列 + 全連接隊列的大小總和。不過,效果不會有太大差異。目前版本中主要表示全連接隊列的大小。 DDOS 攻擊: 根據三次握手原理,產生一種對服務器的攻擊方式:DDOS 攻擊。所謂 DDOS 攻擊,就是客戶端偽造一些不存在的 IP,一直發送 SYN 包,使服務器的半連接隊列不斷增大,當半連接隊列的大小達到極限時,造成網絡阻塞就會導致服務器無法再接受連接,從而使服務器奔潰。

2.1.2、TCP 狀態轉換

TCP 狀態轉換圖: 6bef421a-3514-11ee-9e74-dac502259ad0.png (1)從狀態轉換圖看出,LISTEN 狀態可以通過發送 SYN 和數據轉換到 SYN_SEND 狀態;也就是 LISTEN 狀態可以發送數據。 (2)SYN_SEND 狀態可以收到 SYN,并發送 SYN 和 ACK 轉換到 SYN_RECV 狀態;也就是兩個設備可以互發 SYN 包,建立連接。

2.2 TCP 傳輸數據

TCP 傳輸數據主要依靠 send () 和 recv () 兩個函數。 使用 send () 函數發送數據時,返回正數不一定代表發送成功。因為 send () 函數僅僅只是將數據拷貝到協議棧的寫緩沖區,由協議棧發送;發送過程中會經過 N 個網關,可能存在丟包或鏈路斷開導致未能發送到目的地。如果要知道數據是否發送成功,需要加上確認機制(ACK)。

2.2.1、傳輸控制塊 TCB

為了保證數據能正確分發,TCP 使用一種 TCB(傳輸控制塊)的數據結構,把發送給不同設備的數據封裝起來。這個 TCB 會存在整個 TCP 周期,知道斷開連接。 一個 TCB 數據塊包含數據發送雙方對應的 socket 信息以及擁有存放數據的緩沖區。建立連接連接發送數據之前,通信雙方必須做一個準備工作:分配內存建立 TCB 數據塊。當雙方準備好自己的 socket 和 TCB 數據結構后,就可以進入 “三次握手” 建立連接。

2.2.2、TCP 分包

TCP 分包就是要傳輸的數據很大,超出發送緩存區剩余空間,將會進行分包;待發送的數據大于最大報文長度,TCP 在傳輸前將進行分包。 分包在應用程序的處理一般是發送循環 send (),接收方循環 recv ()。

2.2.3、TCP 粘包及解決方案

TCP 粘包就是發送方發送的若干數據包到接收方接收時粘成一個包,從接收緩沖區看就是后數據包的頭緊接著前數據包的尾。 常見解決方案: (1)(推薦)應用層協議頭前面添加包長度。分兩次接收數據;第一次先接收包的長度,然后根據包的長度一次性讀取或循環讀取數據。 例如:

// ...

ssize count=0;

ssize size=0;

while(countlength)

{

size=recv(fd,buffer,buffersize,0);

count+=size;

}

// ...

(2)為每個包添加分隔符。在數據末尾添加分隔符,這會導致解數據可能需要有合包操作;因為分割數據包后,需要記錄后一個數據包,用于與該包后面部分數據進行合并。

6c4775ac-3514-11ee-9e74-dac502259ad0.png

2.3 TCP 四次揮手

斷開連接是比建立連接和傳輸數據還復雜的一個過程,斷開連接主要分為主動關閉和被動關閉兩種。

四次揮手示意圖:

6c74356a-3514-11ee-9e74-dac502259ad0.png

需要注意的是,調用 close () 不是立即完成斷開,而是關閉了數據傳輸,進入了四次揮手階段,TCB 數據結構還沒有釋放。四次揮手結束才真正把 TCB 釋放。

根據四次揮手流程,可以思考一些問題:

(1)傳輸數據過程中,網線斷了之后立刻連接,TCP 如何知道?

網線掉線網卡會停止供電,再次連接后網卡恢復供電,網卡服務重啟,網絡連接重連。應用程序設計通過心跳包檢測。

(2)服務器如何知道客戶端是否宕機?

一樣需要通過心跳包機制來檢測。

(3)服務器如何甄別網絡阻塞和宕機?

服務器發送心跳包時,不僅僅發一次,而是要發送多次的;如果是網絡阻塞,那么在一定時間內一定有回復信息;如果是宕機,無論多長時間都沒有客戶端的回復。

(4)如果出現大量的 CLOSING 狀態,如何處理?

出現大量 CLOSING 狀態,基本上業務上要處理的邏輯過多,導致一直在 CLOSING 狀態;可以使用異步,將網絡層和業務層分離,單獨處理。

(5)四次揮手中,為什么存在 TIME_WAIT 狀態?

防止沒有 LAST_ACK 或 LAST_ACK 丟失,導致一直重發已經不存在的 socket。

總結

需要掌握 TCP 三次握手和四次揮手的過程,熟悉 TCP 狀態轉換。清楚什么是 SYN 包和 ACK 包。

(1)三次握手是 由客戶端發起 SYN,服務端收到 SYN 后發送 SYN 和 ACK,客戶端回復 ACK;完成連接的建立。

(2)斷開連接主要有主動斷開和被動斷開。

(3)四次揮手是 由發起方調用 close (),同時發送 FIN 包;接收端接收到 FIN 包返回 ACK 包,接收端發送 FIN 包;發起方接收到 FIN 包返回 ACK 包;完成斷開。

(4)理解 TCP 的狀態轉換圖。LISTEN 狀態到 SYN_RCVD 狀態和 SYN_SEND 狀態,如何進入 ESTABLISHED 狀態;四次揮手 FIN_WAIT_1、FIN_WAIT_2、TIME_WAIT、CLOSING 直接的轉換,CLOSE_WAIT 和 LAST_ACK 的處理等。

(5)理解 API 的底層原理,以及全連接隊列和半連接隊列。

(6)TCP 的分包場景以及 TCP 粘包的處理方式。

TCP 通信完整過程:

6c9d40c2-3514-11ee-9e74-dac502259ad0.png


責任編輯:彭菁

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    7237

    瀏覽量

    90909
  • 網絡協議
    +關注

    關注

    3

    文章

    273

    瀏覽量

    21974
  • TCP
    TCP
    +關注

    關注

    8

    文章

    1397

    瀏覽量

    80274
  • 端口
    +關注

    關注

    4

    文章

    1027

    瀏覽量

    32686

原文標題:詳解TCP網絡協議棧的工作原理

文章出處:【微信號:OSC開源社區,微信公眾號:OSC開源社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    全硬件TCP/IP協議學習筆記(第四天:全硬件TCP/IP協議模塊學習)

    做了許多天的網絡協議學習,懵懵懂懂了解了點,索性打開說明書開始模塊的學習 之前天的學習都是在協議上,今天的學習進入以太網接入方案。 PS
    的頭像 發表于 12-18 10:27 ?9065次閱讀
    全硬件<b class='flag-5'>TCP</b>/IP<b class='flag-5'>協議</b><b class='flag-5'>棧</b>學習筆記(第四天:全硬件<b class='flag-5'>TCP</b>/IP<b class='flag-5'>協議</b>模塊學習)

    通信網絡協議之UDP協議技術解析

    在通常的網絡協議中,TCP/IP協議是一常見的
    發表于 02-01 11:00 ?1367次閱讀
    通信<b class='flag-5'>網絡</b><b class='flag-5'>協議</b><b class='flag-5'>棧</b>之UDP<b class='flag-5'>協議</b>技術解析

    協議介紹--TCP/IP

    的利用率高。且CPU的占用率低。10)本協議支持外網,運行時需要通過ICS服務器與局域網外部網絡進行數據通訊。運行時需要設置相關的網關地址,網關地址通過IP層代碼進行MAC地址的轉換與封裝。
    發表于 09-03 15:03

    嵌入式學習的三個階段詳解

      嵌入式可以簡單分為硬件與軟件,然而其中的知識體系卻是異常的龐大,這也是眾多新手望而卻步的一原因,那究竟要如何才能成為一名嵌入式大咖呢?今天和大家聊一聊嵌入式學習路線,大致分為三個階段:基礎篇
    發表于 07-06 03:33

    LwIP協議開發嵌入式網絡種方法有何關系

    LwIP協議開發嵌入式網絡種方法分析 輕量級的TCP/IP協議
    發表于 08-05 07:55

    基于LwIP輕量級網絡協議實現一TCP協議通信的例程

    1、基于LwIP輕量級網絡協議實現一TCP協議通信的例程硬件準備一塊 BL706 ETH 開
    發表于 06-29 17:58

    TCP/IP協議之路由器簡要分析

    TCP/IP協議中,在封裝報文時就相當于是壓操作,而在報文解析過程中,則是一的過程,在封裝是最先被壓進
    發表于 10-10 11:46 ?1次下載

    MPLAB? Harmony TCP/IP協議

    本視頻將介紹MPLAB? Harmony嵌入式網絡解決方案。MPLAB Harmony提供免費的TCP/IP協議,可以處理物理網絡端口和用
    的頭像 發表于 06-07 13:46 ?3448次閱讀
    MPLAB? Harmony <b class='flag-5'>TCP</b>/IP<b class='flag-5'>協議</b><b class='flag-5'>棧</b>

    理解TCP/IP協議遇到的三個疑問解答

    雖然國際標準化組織制定了這樣一網絡協議的模型,但是實際上互聯網通訊使用的網絡協議TCP/IP
    的頭像 發表于 10-22 14:40 ?2452次閱讀

    Microchip TCP/IP精簡協議

    本應用筆記描述 Microchip 傳輸控制協議 / 互聯網協議TCP/IP)精簡協議庫的結構和接口,并提供部分簡單的演示應用。實現
    發表于 04-01 15:36 ?18次下載
    Microchip <b class='flag-5'>TCP</b>/IP精簡<b class='flag-5'>協議</b><b class='flag-5'>棧</b>

    Microchip TCP/IP協議

    。感興趣的開發人員可以很容易找到許多 Microchip 產品的商業和非商業的TCP/IP 實現方案。本應用筆記詳細說明了 Microchip 公司自己免費提供的 TCP/IP 協議
    發表于 04-02 14:28 ?22次下載
    Microchip <b class='flag-5'>TCP</b>/IP<b class='flag-5'>協議</b><b class='flag-5'>棧</b>

    Linux網絡技術中最核心的部分--TCP/IP協議

    今天給大家介紹Linux網絡技術中最核心的部分--TCP/IP協議 。 我們先看一下抽象的網絡協議
    的頭像 發表于 06-29 15:14 ?2488次閱讀

    到底什么是TCP/IP協議,看完這篇你就明白!

    一談到TCP/IP協議,相信不少小白都處于暴躁的邊緣,只懂其一不知其二。沒關系,看完這篇你就知道啦!我們先簡單了解下TCP/IP協議,該
    的頭像 發表于 12-09 15:21 ?1701次閱讀
    到底什么是<b class='flag-5'>TCP</b>/IP<b class='flag-5'>協議</b><b class='flag-5'>棧</b>,看完這篇你就明白!

    tcpip協議是什么?tcpip協議有哪些協議?tcpip協議中報文封裝和解封裝過程

    tcpip協議是什么? TCP/IP協議是計算機網絡中使用的最常見的
    的頭像 發表于 08-01 17:51 ?9428次閱讀
    tcpip<b class='flag-5'>協議</b><b class='flag-5'>棧</b>是什么?tcpip<b class='flag-5'>協議</b><b class='flag-5'>棧</b>有哪些<b class='flag-5'>協議</b>?tcpip<b class='flag-5'>協議</b><b class='flag-5'>棧</b>中報文封裝和解封裝過程

    Linux網絡協議的實現

    網絡協議是操作系統核心的一重要組成部分,負責管理網絡通信中的數據包處理。在 Linux 操作系統中,
    的頭像 發表于 09-10 09:51 ?555次閱讀
    Linux<b class='flag-5'>網絡</b><b class='flag-5'>協議</b><b class='flag-5'>棧</b>的實現
    主站蜘蛛池模板: 国产高清免费 | 日本特级淫片免费看 | 天堂网在线www | 亚洲综合久久久 | 如果我们是季节韩剧在线观看 | 免费在线播放视频 | 看大片全色黄大色黄 | 丁香花的视频免费观看 | 亚洲视频一区二区 | 天天干人人| 国产h视频在线观看高清 | 国产精品欧美精品国产主播 | 五月综合在线 | 免费观看三级毛片 | 久久草在线精品 | 在线色站| 日韩免费精品一级毛片 | 久久久久久全国免费观看 | 美国一级做a一级爱视频 | 天堂bt种子资源+在线 | 萌白酱白丝护士服喷水铁牛tv | 国内一区二区三区精品视频 | 国产免费高清福利拍拍拍 | 日本亚洲免费 | 潘金莲国产三级视频在线 | 色综合天天网 | 97久久精品国产精品青草 | 香蕉视频一级 | www.四虎影院在线观看 | 欧美性另类 | 国产女在线 | 久久精品国产2020观看福利色 | h国产在线观看 | 色女孩网站 | 免费观看a毛片一区二区不卡 | 狠狠操精品视频 | 天堂tv亚洲tv日本tv欧美人tv | 511韩国理论片在线观看 | 午夜手机看片 | 在线播放91灌醉迷j高跟美女 | h网站免费在线观看 |