網絡學習-TCP協議(七)

一、TCP協議

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

1、三次握手

在這里插入圖片描述

客戶端:
1、先發起連接,發送SYN置1,seqnum=12345(隨機值)----半連接建立,形成syn隊列

服務端:
1、收到SYN,分配tcp控制塊
2、發送ack置1,acknum=12346, syn,seqnum=34531(隨機值)

客戶端:
2、發送ack,acknum=34532 ,seqnum=12346(從之前的序列號+1) ----半連接轉為全連接,進入accept隊列

小結:

可見在TCP協議中,服務端是被動連接。

2、四次揮手

注意只有主動方和被動方:

1、主動發起斷開連接,發送FIN置1,seqnum=1234(隨機值)
2、被動方收到FIN,發送ack置1,acknum=1235(seq+1)
3、被動方發送FIN,seqnum=5678(隨機值)
4、主動方收到FIN,發送ack置1,acknum=5679(seq+1)

3、TCP的格式

在這里插入圖片描述

首部開銷最小20字節,最大60字節

4、網絡協議棧

在這里插入圖片描述

應用層:http,ftp,ssh
傳輸層:TCP,UDP
網絡層:IP,ICMP

5、TCP發生在哪些函數中:

通過對網絡I/O的學習,發現無論使用select,poll,還是epoll,都沒看見TCP/UDP的相關字眼,那電腦是如何判斷使用哪種協議來實現連接的?
回顧之前代碼,主要使用了socket()bind(), listen(), accept(), connect(), send(), recv(), **close()**這幾個函數。

  • 這些函數是如何實現TCP連接的?
  • 這些函數編譯生成的執行文件,為什么在不同系統平臺可以正常運行?

二、POSIX API

1、什么是POSIX API?

  • 是一套可移植操作系統接口標準,旨在使應用程序可以在多種UNIX和類UNIX操作系統上運行而無需修改。
  • 像之前使用的socket()bind(), listen(), accept(), connect(), send(), recv(), close()fcntl()select,poll,epoll等函數,都是POSIX API的一部分。

2、三次握手的過程,發送在哪些函數里面:

  • 客戶端:
    client:
    Connet()

  • server:
    listen();
    accept();

3、API簡介

1. socket()

int socket(int domain, int type, int protocol);
/*
*socket英文單詞的本意是插座,在網絡編程中,socket代表網絡IO的建立,實質是(fd,tcp控制塊--stream)
*功能:
*分配fd,bitmap
*tcp控制塊的分配
*domain:通信協議族,AF_INET, AF_UNIX,AF_INET6,大部分都是基于IPV4的網絡通信,通常使用AF_INET
*type:指定套接字類型,SOCK_STREAM(字節流)---TCP協議,SOCK_DGRAM(報文)---UDP協議,SOCK_RAW---原始套接字
*protocol:指定具體的協議,通常為0。前兩個參數確定了,第三個參數通常為0,由內核自動選擇合適的協議
*返回值:成功返回非負文件描述符,失敗返回-1
*/

2. bind()

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
/*
1、綁定固定ip,port
2、還未到tcp建立過程
3、屬于設置過程
返回值:成功返回0,失敗返回-1
*/

3. listen()

int listen(int sockfd, int backlog);
/*
1、設置監聽,等待客戶端連接
2、backlog:半連接隊列的大小(內核參數,默認值5)
3、TCP開始建立
返回值:成功返回0,失敗返回-1
實質:
1、把TCP的status設置為TCP_STATUS_LISTEN
2、如果不設置,強行連接,會被拒絕
3、設置tcp全連接隊列和半連接隊列tcp->syn_queuetcp->accept_queue
*/

4. accept()

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
/*
1、阻塞等待客戶端的連接請求
2、屬于建立TCP的完成后
返回值:成功返回非負文件描述符,失敗返回-1
實質:
分配fd給客戶端,并把客戶端的fd和tcp控制塊綁定EPOLLLT:水平觸發
只要有事件就緒就會一直通知EPOLLET:邊緣觸發
只有當事件發生時才會通知一次
避免不能及時響應需要額外添加while循環進行處理
while(1){fd = accept(listenfd, NULL, NULL);if(fd < 0) {break;}
}
*/

5. connect()

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
/*
1、主動發起tcp連接
2、屬于建立TCP的過程
返回值:成功返回0,失敗返回-1
*/

6. send()

ssize_t send(int sockfd, const void *buf, size_t len, int flags);
/*
flags:用于指定發送數據的特殊選項,如MSG_DONTWAIT,非阻塞模式,一般默認為0
1、發送數據到對方
2、屬于傳輸層
返回值:成功返回發送的字節數,失敗返回-1
實質:
將數據從用戶空間拷貝到內核緩沖區,然后通過網絡發送到對方的內核緩沖區(協議棧),異步操作
*/ssize_t write(int fd, const void *buf, size_t count);
/*
1、發送數據到對方
返回值:成功返回發送的字節數,失敗返回-1
相比于send,少了一個flags參數,其余相同,send是POSIX API,write是標準C庫函數
如果是網絡編程,推薦使用send,因為send可以指定flags參數
*/

7. recv()

ssize_t recv(int sockfd, void *buf, size_t len, int flags);
/*
flags:用于指定接收數據的特殊選項,如MSG_WAITALL,阻塞直到所有數據都收到
1、接收數據
2、屬于傳輸層
返回值:成功返回接收的字節數,失敗返回-1
實質:
將對方內核緩沖區的數據拷貝到用戶空間緩沖區,異步操作
*/
ssize_t read(int fd, void *buf, size_t count);
/*
1、接收數據
返回值:成功返回接收的字節數,失敗返回-1
相比于recv,少了一個flags參數,其余相同,recv是POSIX API,read是標準C庫函數
如果是網絡編程,推薦使用recv,因為recv可以指定flags參數
*/

8. close()

int close(int fd);
/*
1、關閉fd,釋放bitmap位圖資源
2、如果是TCP連接,會發送fin包給對方,等待對方的ack包
3、如果是UDP連接,直接釋放資源
返回值:成功返回0,失敗返回-1
實質:
回收fd,釋放bitmap位圖資源
如果是tcp連接,發送fin包給對方,等待對方的ack包
如果是udp連接,直接釋放資源
*/int shutdown(int sockfd, int howto);
/*
howto:用于指定關閉哪一部分連接,SHUT_RD(關閉讀),SHUT_WR(關閉寫),SHUT_RDWR(同時關閉讀寫)
1、關閉fd,釋放bitmap位圖資源
2、如果是TCP連接,可以指定只關閉讀或者寫
返回值:成功返回0,失敗返回-1
實質:
回收fd,釋放bitmap位圖資源
如果是tcp連接,可以選擇只關閉讀或者寫
不推薦使用,關閉連接就關閉了,使用shutdown,還只關閉一部分連接,容易引起混亂
*/

三、總結

1、在TCP傳輸過程中,服務端屬于被動連接,客戶端屬于主動發起連接。

2、對于不同的系統平臺,使用了POSIX API,可以實現跨平臺網絡編程。

四、拓展問題

1、tcp連接的生命周期從什么時候開始?

tcp連接的生命周期是從三次握手開始,到四次揮手結束。即客戶端調用connect()開始,到服務端調用close()結束。

2、第三次握手數據包,如何從半連接隊列查找匹配的節點

源端口,目的端口,源ip,目的ip

3、syn泛洪攻擊

  • 定義:
    syn泛洪攻擊是一種常見的網絡攻擊手段,其目的是通過發送大量的TCP連接請求(SYN包),耗盡服務器的資源,從而阻止合法的用戶建立正常的TCP連接。
  • 解決方案:
    早期系統版本,通過listen(fd, backlog)第二個參數,控制半連接隊列的大小
    然后是將半連接隊列的大小設置為syn+accept隊列總長度,放未分配fd的tcb的數量
    現在大部分系統是將半連接隊列的大小設置為accept隊列長度

4、為什么建立連接需要三次握手,而斷開連接需要四次揮手?

  • 三次握手:
    為了實現數據的可靠性傳輸;TCP通信協議雙方,都必須維護一個序列號,以標識發送出去的數據包,哪些是已經被對方收到。實質上是通信雙方相互告知序列號的起始值,并確認對方已經收到了這個序列號。如果是兩次握手,至多只有連接發起方的序列號能被確認,而另一方的序列號無法被確認。
  • 四次揮手:
    為了保證數據完整性,TCP協議需要通過四次揮手來正確關閉連接。主動方發送FIN包后,被動方需要先回復ACK確認收到,然后再發送自己的FIN包給主動方,最后等待主動方的ACK確認收到后才真正斷開連接。這樣可以確保雙方都能夠正確地關閉連接,避免數據丟失

5、accept發生在三次握手的哪一步

發生在第三次握手之后,TCP建立完成之后。

6、TCP是如何保證順序的?

通過序列號、確認應答、重傳機制、滑動窗口和擁塞控制等多種機制來保證數據的順序性。

7、ack沒有收到,先收到fin怎么辦?

繼續發ack

8、雙方調用close會發生什么?

結論:服務端會出現大量的TIME_WAIT狀態

  • ?雙方發送FIN報文,都進入FIN_WAIT_1狀態
  • ?雙方收到FIN并發送ACK,都進入closing狀態
  • ?雙方收到ACK并進入TIME_WAIT狀態,等待2MSL(最大段生存時間)以確保對方收到ACK。
  • ?連接完全關閉,2MSL超時后,雙方都進入CLOSED狀態,連接完全關閉。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81944.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81944.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81944.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Python 基礎與實戰】從基礎語法到項目應用的全流程解析

&#xff08;1&#xff09;列表和元組的區別是什么?如何從列表創建元組?如何從元組創建列表? 列表和元組的區別&#xff1a; 可變性&#xff1a;列表是可變的&#xff0c;即可以對列表進行元素的增、刪、改操作。例如&#xff0c;可以使用append()方法添加元素&#xff0c;r…

Docker部署Zookeeper集群

簡介 ZooKeeper 是一個開源的分布式協調服務&#xff0c;由 Apache 軟件基金會開發和維護。它主要用于管理和協調分布式系統中的多個節點&#xff0c;以解決分布式環境下的常見問題&#xff0c;如配置管理、服務發現、分布式鎖等。ZooKeeper 提供了一種可靠的機制&#xff0c;…

【學習筆記】Sophus (Python) 使用文檔

以下是一份針對 Sophus 庫的 Python 使用文檔&#xff0c;涵蓋基礎概念、安裝方法、核心功能及代碼示例。內容圍繞 SO3&#xff08;3D旋轉群&#xff09;和 SE3&#xff08;3D剛體變換群&#xff09;展開&#xff0c;適合機器人學、SLAM、三維幾何等領域。 Sophus (Python) 使用…

計算機圖形學:(三)MVP變換擴展

Three.js WebGL允許把JavaScript和OpenGL 結合在一起運用&#xff0c;但使用WebGL原生的API來寫3D程序非常的復雜&#xff0c;同時需要相對較多的數學知識&#xff0c;對于前端開發者來說學習成本非常高。 Three.js是基于webGL的封裝的一個易于使用且輕量級的3D庫&#xff0c;T…

MySQL數據庫操作合集

一、SQL通用語法 ①SQL語句可以單行或多行書寫&#xff0c;以分號結尾。 ②SQL語句可以使用空格/縮進來增強語句可讀性。 ③MySQL數據庫的SQL語句不區分大小寫&#xff0c;關鍵字建議使用大寫。 ④注釋&#xff1a; 單行注釋&#xff1a; -- 注釋內容 或 # 注釋內容&#…

傳統工程項目管理與業財一體化管理的區別?

在工程項目管理領域&#xff0c;傳統管理模式與新興的業財一體化管理模式正在形成鮮明對比。隨著數字化轉型的加速&#xff0c;工程行業對高效、透明、協同的管理需求日益迫切。傳統工程項目管理依賴人工操作、分散系統和分模塊管理&#xff0c;難以應對復雜項目的全生命周期需…

敦煌網測評從環境搭建到風控應對,精細化運營打造安全測評體系

自養號測評&#xff0c;搶占流量為快速提升產品權重和銷量&#xff0c;很多賣家常采用自己養號補單測評的方式&#xff0c;技術搭建需要很多要素 一、硬件參數的關聯性 在我們使用設備進行注冊或操作賬號的過程中&#xff0c;系統會記錄下大量的系統與網絡參數&#xff0c;其中…

redis Pub/Sub 簡介 -16 (PUBLISH、SUBSCRIBE、PSUBSCRIBE)

Redis Pub/Sub 簡介&#xff1a;PUBLISH、SUBSCRIBE、PSUBSCRIBE Redis Pub/Sub 是一種強大的消息傳遞范例&#xff0c;可在應用程序的不同部分之間實現實時通信。它是構建可擴展和響應式系統的基石&#xff0c;允許組件在沒有直接依賴的情況下進行交互。本章將全面介紹 Redis…

JavaSE核心知識點03高級特性03-01(集合框架)

&#x1f91f;致敬讀者 &#x1f7e9;感謝閱讀&#x1f7e6;笑口常開&#x1f7ea;生日快樂?早點睡覺 &#x1f4d8;博主相關 &#x1f7e7;博主信息&#x1f7e8;博客首頁&#x1f7eb;專欄推薦&#x1f7e5;活動信息 文章目錄 JavaSE核心知識點03高級特性03-01&#xff0…

日志分析-IIS日志分析

環境準備 https://xj.edisec.net/challenges/115 題目要求 windows系統中才有的IIS服務 既然是windows平臺&#xff0c;當然需要rdp登錄&#xff0c;在ssh登錄失敗 解題過程 phpstudy--2018站點日志.(.log文件)所在路徑&#xff0c;提供絕對路徑 Windows服務的日志一般有固定…

一、web安全基礎入門

1、Windows命令 文件和目錄操作 dir&#xff1a;列出當前目錄下的文件和子目錄。cd&#xff1a;切換目錄&#xff0c;例如 cd C:\Users 切換到C盤的Users目錄。md 或 mkdir&#xff1a;創建新目錄&#xff0c;如 md testdir。rd 或 rmdir&#xff1a;刪除空目錄&#xff0c;例…

動態規劃應用場景 + 代表題目清單(模板加上套路加上題單)

1. 序列型DP&#xff08;Sequence DP&#xff09; ? 應用場景 單個或多個序列&#xff08;數組/字符串&#xff09;&#xff0c;求最優子結構。 常見問題&#xff1a;最長遞增子序列、最長公共子序列、回文子序列。 &#x1f9e0; 套路總結 單序列&#xff1a;dp[i] max(…

Linux iSCSI存儲共享實驗指南

實驗介紹 1、在Linux平臺上通過iSCSI協議實現IP-SAN存儲共享 2、掌握存儲導出(export)和存儲導入(import)的配置方法 3、學習iSCSI存儲的發現、連接、斷開和管理操作 1、實驗環境 兩臺同網段的Linux虛擬機&#xff08;無需物理交換機&#xff09; 操作系統&#xff1a;Lin…

從 Docker 到 runC

從 Docker 到 runC:容器底層原理詳解 目錄 1. Docker 與 runC 的關系 2. Docker 的核心組件 3. runC 的核心功能 4. 實戰示例:從 Docker 到 runC 4.1 示例場景:運行一個簡單容器 4.2 Docker 底層調用 runC 的流程 4.3 查看 runC 的調用 4.4 直接調用 runC 創建容器 …

使用Python在PowerPoint中插入形狀(Shape)

在進行演示文稿設計時&#xff0c;形狀&#xff08;Shape&#xff09;不僅可以增強視覺效果&#xff0c;還可以用于展示流程圖、標注、數據圖示等。借助Python&#xff0c;我們可以通過代碼快速批量地在PPT中添加各種形狀&#xff0c;提升設計效率。本文將介紹如何使用Python向…

Windows系統下MySQL 8.4.5壓縮包安裝詳細教程

一、MySQL 8.4.5新特性概覽 相較于舊版本&#xff0c;MySQL 8.4.5在性能與功能上實現了顯著提升&#xff1a; 性能優化&#xff1a;官方測試顯示&#xff0c;在高并發場景下&#xff0c;其讀寫性能較5.7版本提升近2倍&#xff0c;尤其在處理熱點數據競爭問題時表現更為出色。…

深度解析Vue項目Webpack打包分包策略 從基礎配置到高級優化,全面掌握性能優化核心技巧

深度解析Vue項目Webpack打包分包策略 從基礎配置到高級優化&#xff0c;全面掌握性能優化核心技巧 一、分包核心價值與基本原理 1.1 為什么需要分包 首屏加載優化&#xff1a;減少主包體積&#xff0c;提升TTI&#xff08;Time to Interactive&#xff09;緩存利用率提升&am…

【昇騰開發者訓練營:Dify大模型部署實戰】MindIE + Dify + DeepSeek + Embedding模型 + Rerank模型

文章目錄 部署 Dify1. Dify 適配 ARM2. 安裝 docker3. 啟動 Dify MindIEDify 實操手冊1. 基礎環境搭建1.1 環境檢查1.2 下載模型權重1.3 獲取MindIE鏡像 2. 啟動容器3. 純模型推理測試3.1 純模型對話測試3.2 性能測試 4. 服務化部署4.1 MindIE 配置4.2 MindIE 服務化4.3 發起測…

塔能高溫冰蓄冷技術:工廠能耗精準節能的創新之路

在工廠的能耗構成中&#xff0c;制冷系統是重要的耗能環節。傳統的水蓄冷和冰蓄冷技術在實際應用中存在一些局限性&#xff0c;難以滿足工廠對節能和成本控制的更高要求。塔能科技的高溫冰蓄冷技術&#xff0c;憑借其獨特的優勢&#xff0c;為工廠能耗精準節能提供了創新的解決…

通過現代數學語言重構《道德經》核心概念體系,形成一個兼具形式化與啟發性的理論框架

以下是對《道德經》的數學轉述嘗試&#xff0c;通過現代數學語言重構其核心概念&#xff0c;形成一個兼具形式化與啟發性的理論框架&#xff1a; 0. 基礎公理體系 定義&#xff1a; 《道德經》是一個動態宇宙模型 U(D,V,Φ)&#xff0c;其中&#xff1a; D 為“道”的無限維…