色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    7075

    瀏覽量

    89153
  • 網絡協議
    +關注

    關注

    3

    文章

    268

    瀏覽量

    21569
  • TCP
    TCP
    +關注

    關注

    8

    文章

    1370

    瀏覽量

    79133
  • 端口
    +關注

    關注

    4

    文章

    978

    瀏覽量

    32100

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

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

收藏 人收藏

    評論

    相關推薦

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

    做了許多天的網絡協議學習,懵懵懂懂了解了點,索性打開說明書開始模塊的學習 之前天的學習都是在協議上,今天的學習進入以太網接入方案。 PS
    的頭像 發表于 12-18 10:27 ?8792次閱讀
    全硬件<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 ?1009次閱讀
    通信<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 ?3271次閱讀
    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 ?2278次閱讀

    Microchip TCP/IP精簡協議

    本應用筆記描述 Microchip 傳輸控制協議 / 互聯網協議TCP/IP)精簡協議庫的結構和接口,并提供部分簡單的演示應用。實現
    發表于 04-01 15:36 ?17次下載
    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 ?2358次閱讀

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

    一談到TCP/IP協議,相信不少小白都處于暴躁的邊緣,只懂其一不知其二。沒關系,看完這篇你就知道啦!我們先簡單了解下TCP/IP協議,該
    的頭像 發表于 12-09 15:21 ?1458次閱讀
    到底什么是<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 ?8692次閱讀
    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 ?326次閱讀
    Linux<b class='flag-5'>網絡</b><b class='flag-5'>協議</b><b class='flag-5'>棧</b>的實現
    主站蜘蛛池模板: 啦啦啦WWW在线观看免费高清版| 国产精品卡1卡2卡三卡四| 亚洲 日韩 自拍 视频一区| 青青操久久| 年轻的老师5理伦片| 美国ZOOM动物在线观看| 快乐激情网| 老人洗澡自拍xxx互摸| 老熟女重囗味GRANNYBBW| 久久久精品免费视频| 久久精品AV麻豆| 快播最新电影网站| 免费精品一区二区三区在线观看 | 嫩草电影网嫩草影院| 美女脱得只剩皮肤| 美女张开腿让男人桶爽无弹窗 | 野花日本大全免费高清完整版| 亚洲欧美日韩在线码不卡| 亚洲免费人成在线视频观看| 亚洲人成www在线播放| 一本二卡三卡四卡乱码麻豆| 英国video性精品高清最新| 在镜头里被CAO翻了H| 26uuu老色哥| RUNAWAY韩国动漫免费网| 成人在线视频免费观看| 国产精品久久久久久久人热| 果冻传媒独家原创在线观看| 久久99国产精品二区不卡| 老人洗澡自拍xxx互摸| 欧美高清69vivo| 日韩欧美一区二区三区在线 | 扒开美女嫩bbb| 国产精品99| 湖南电台在线收听| 考好老师让你做一次H| 欧美 日韩 无码 有码 在线| 日本人娇小hd| 亚洲国产在线99视频| 在线视频网站www色| cntv官网|