TCP服務建立的全流程詳解

TCP的服務監聽步驟(等待客戶端連接前)

TCP 服務器通過以下步驟完成從初始化到等待客戶端連接,為后續的數據傳輸(send()/recv())奠定了基礎

一、創建套接字(Socket)

  • 作用:套接字是網絡通信的端點,用于標識通信中的雙方(IP 地址和端口號)。服務器首先需要創建一個套接字,作為后續監聽和通信的基礎。
  • 實現:應用程序通過系統調用(如socket())創建套接字,指定地址族(如 IPv4 用AF_INET)、傳輸層協議(TCP 用SOCK_STREAM)等參數。
  • 示例:在 Linux 中,int sockfd = socket(AF_INET, SOCK_STREAM, 0);?會創建一個 TCP 套接字,返回套接字描述符sockfd

二、綁定套接字到本地地址和端口(Bind)

  • 作用:將創建的套接字與服務器的本地 IP 地址和指定端口號綁定,確保客戶端能通過該地址和端口找到服務器。
  • 實現
    1. 應用程序定義一個包含本地 IP 地址和端口號的結構體(如sockaddr_in)。
    2. 通過系統調用(如bind())將套接字與該結構體綁定。
  • 注意
    • 端口號通常選擇 1024 以上的非特權端口(避免與系統服務沖突)。
    • 若 IP 地址設為INADDR_ANY(通配地址),表示服務器監聽所有可用的本地網絡接口。
  • 示例bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));

三、設置監聽狀態(Listen)

  • 作用:將綁定后的套接字轉換為監聽套接字,使其能夠接收客戶端的連接請求。同時,操作系統會為該套接字維護一個連接請求隊列(未完成三次握手的客戶端請求)。
  • 實現:通過系統調用(如listen())設置監聽,參數包括監聽套接字和隊列的最大長度(backlog,即最多能同時等待處理的連接請求數)。
  • 注意backlog的值需根據服務器性能和預期并發量設置,若隊列滿,新的連接請求會被拒絕(客戶端可能收到 “連接超時” 錯誤)。
  • 示例listen(sockfd, 5);(表示最多允許 5 個連接請求在隊列中等待)。

四、等待并接受客戶端連接(Accept)

  • 作用:監聽套接字進入阻塞狀態(默認情況),等待客戶端的連接請求。當有客戶端發起連接時,服務器通過accept()系統調用接受連接,生成一個新的連接套接字用于與該客戶端通信。
  • 過程
    1. 客戶端通過connect()發起 TCP 連接請求,與服務器進行三次握手。
    2. 三次握手完成后,連接請求從 “未完成隊列” 移至 “已完成隊列”。
    3. 服務器調用accept()從 “已完成隊列” 中取出一個連接請求,創建新的連接套接字(與監聽套接字的 IP 和端口相同,但用于單獨的客戶端通信)。
  • 注意
    • 監聽套接字始終保持監聽狀態,用于接收新的連接請求;連接套接字則用于與特定客戶端的數據傳輸。
    • 若需處理并發連接,服務器通常會通過多線程、多進程或 I/O 復用(如selectepoll)來同時管理多個連接套接字。
  • 示例int new_fd = accept(sockfd, (struct sockaddr*)&client_addr, &addr_len);new_fd即為新的連接套接字)。

總結:TCP 服務監聽的完整流程

  1. 創建套接字(socket())→ 2. 綁定地址和端口(bind())→ 3. 設置監聽(listen())→ 4. 接受連接(accept())。

服務端與客戶端通信(3握手4揮手)

TCP 通信遵循 "三次握手建立連接、數據傳輸、四次揮手斷開連接" 的經典模式,這種模式確保了通信的可靠性和有序性。

1. 連接建立:三次握手

TCP 是面向連接的協議,在進行實際數據傳輸前,通信雙方必須先建立連接,這個過程被形象地稱為 "三次握手"(Three-way Handshake)。

  • 第一次握手:客戶端發送 SYN(同步序列編號)報文段,告知服務器客戶端的初始序列號(ISN),并請求建立連接。
  • 第二次次握手:服務器收到 SYN 后,返回一個 SYN+ACK(確認)報文段,包含服務器的初始序列號,并確認收到客戶端的 SYN(ACK 值 = 客戶端 ISN+1)。
  • 第三次握手:客戶端收到服務器的 SYN+ACK 后,發送一個 ACK 報文段,確認收到服務器的 SYN(ACK 值 = 服務器 ISN+1)。

三次握手完成后,TCP 連接正式建立,雙方可以開始數據傳輸。這種設計有效防止了因網絡延遲導致的 "已失效的連接請求報文段" 被服務器接收,從而避免資源浪費。

2. 數據傳輸階段

連接建立后,進入數據傳輸階段。TCP 通過以下機制保證數據傳輸的可靠性:

  • 序列號與確認機制:每個數據字節都有一個序列號,接收方收到數據后會返回確認信息,告知發送方已成功接收的數據量。
  • 超時重傳:發送方設置超時計時器,若在規定時間內未收到確認,則重傳數據。
  • 流量控制:通過滑動窗口機制,控制發送方的發送速率,避免接收方緩沖區溢出。
  • 擁塞控制:檢測網絡擁塞狀態并調整發送速率,避免網絡過載。

3. 連接終止:四次揮手

當通信結束需要斷開連接時,TCP 使用 "四次揮手"(Four-way Wavehand)過程:

  • 第一次揮手:主動關閉方發送 FIN(結束)報文段,告知對方要關閉連接。
  • 第二次揮手:被動關閉方收到 FIN 后,返回 ACK 確認,此時主動關閉方到被動關閉方的連接半關閉。
  • 第三次揮手:被動關閉方準備好關閉連接后,也發送一個 FIN 報文段。
  • 第四次揮手:主動關閉方收到 FIN 后,返回 ACK 確認,被動關閉方到主動關閉方的連接也半關閉。等待一段時間確保確認報文送達后,連接完全關閉。

四次揮手的設計是因為 TCP 連接是全雙工的,允許雙方獨立關閉各自的發送通道。

服務端的全流程

1. 調用 socket 函數創建 socket(監聽socket)
2. 調用 bind 函數 將 socket綁定到某個ip和端口的二元組上
3. 調用 listen 函數 開啟偵聽
4. 當有客戶端請求連接上來后,調用 accept 函數接受連接,產生一個新的 socket(客戶端 socket)
5. 基于新產生的 socket 調用 send 或 recv 函數開始與客戶端進行數據交流
6. 通信結束后,調用 close 函數關閉監聽?socket

1. 三次握手(建立連接)發生在第 4 步:accept()?函數執行期間

  • 當服務器調用?listen()?后,進入 “監聽” 狀態,內核會維護兩個隊列:
    • 未完成連接隊列:客戶端已發送 SYN 但三次握手未完成的請求。
    • 已完成連接隊列:三次握手已完成、等待服務器處理的連接。
  • 當客戶端調用?connect()?發起連接時,內核會自動完成三次握手:
    1. 客戶端發送 SYN → 服務器內核接收并放入未完成隊列,返回 SYN+ACK(第二次握手)。
    2. 客戶端返回 ACK(第三次握手)→ 服務器內核將連接從 “未完成隊列” 移至 “已完成隊列”。
  • 此時服務器調用?accept()?函數,只是從 “已完成隊列” 中取出一個已建立的連接,并創建新的客戶端 socket。三次握手的整個過程由內核在?listen()?之后、accept()?返回之前自動完成,應用程序無需干預。

2. 四次揮手(斷開連接)發生在數據傳輸結束后,由?close()?函數觸發

  • 當通信雙方(客戶端或服務器)決定結束連接時,調用?close()?函數會觸發內核執行四次揮手:
    1. 主動關閉方調用?close()?→ 內核發送 FIN 報文(第一次揮手)。
    2. 被動關閉方收到 FIN 后,內核自動返回 ACK(第二次揮手),此時主動關閉方向被動關閉方的連接 “半關閉”。
    3. 被動關閉方處理完剩余數據后,調用?close()?→ 內核發送 FIN 報文(第三次揮手)。
    4. 主動關閉方收到 FIN 后,內核自動返回 ACK(第四次揮手),等待超時后連接完全關閉。
  • 注意:通常服務器會先關閉 “客戶端 socket”(與單個客戶端的連接),最后再關閉 “監聽 socket”(停止接受新連接)。四次揮手由內核在?close()?調用后自動完成,應用程序只需調用?close()?觸發這個過程。

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

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

相關文章

數據結構 雙鏈表與LinkedList

本節目標: 認識并且能夠實現一個雙鏈表認識LinkedList類并且知道如何去使用 1.雙鏈表 概念 在數據結構中,雙鏈表(Doubly Linked List) 是一種常見的線性數據結構,它由一系列節點組成,每個節點不僅包含數據…

如何解決 JetBrains IntelliJ IDEA 2024.2 和 2025.2 新版本區域選擇問題:key is invalid

如何解決 JetBrains IntelliJ IDEA 2024.2 和 2025.2 新版本區域選擇問題:key is invalid 在 JetBrains 發布的 IntelliJ IDEA、PyCharm 2024.2 和 2025.2 新版本中,增加了一個新的功能——區域選擇。在設置菜單中,你可以找到這一選項&#…

GSON 框架下百度天氣 JSON 數據轉 JavaBean 的實戰攻略

目錄 前言 一、百度天氣JSON 1、請求參數 2、返回參數 3、屬性映射 二、GSON屬性映射實戰 1、類對象映射 2、屬性字段映射 3、日期數據映射 三、天氣接口對象展示 1、接口調用 2、Java屬性打印輸出 四、總結 前言 在當今數字化時代,數據的高效處理與轉換…

NAS技術在縣級融媒體中心的架構設計與安全運維淺析

NAS技術在縣級融媒體中心的架構設計與安全運維淺析 ——原理剖析、應用實踐與防御體系建設作者:高級網絡安全工程師 吉林?鎮賚融媒 劉曉偉 最后更新:2025年8月 適用對象:媒體行業網絡安全從業者一、NAS技術核心原理剖析 1. 基礎架構 NAS&am…

CobaltStrike的搭建和使用

下載CobaltStrike環境建議使用jdk17,其他java版本有些功能可能無法使用通過網盤分享的文件:CS4.7key-mht.zip 鏈接: https://pan.baidu.com/s/1CRd1x4r6EIk14BD3UCLgxw?pwdevf4 提取碼: evf4將下載的文件分別放在服務器和 本地/kali 上 也就是服務器為…

【Altium designer】一鍵給多個器件添加參數

目的: 一鍵給N個元器件/Part添加參數和修改參數值,比如一鍵給多個電阻添加“備注”并賦予備注的內容為“不焊接”,或者更改“備注”的內容為“不焊接”或空。 背景: 剛入門用AD畫原理圖,因為原理圖的電阻、電容和芯片等等的冗余/兼容設計太多,增加備注不焊的元器件位號…

熟練掌握switch語句:技巧與運用

目錄 一、switch語句基礎 基本語法結構: 在C/C中: 注意事項: 二、if與switch語句對比 示例:計算整數除以3的余數 使用if語句實現: 使用switch語句實現: 三、break語句的作用 示例(無br…

【03】廈門立林科技——立林科技 嵌入式 校招筆試,題目記錄及解析

廈門立林科技——立林科技 嵌入式 校招筆試,題目記錄及解析 1.下面的程序的輸出是()。2.在頭文件中#ifndef/#define/#endif的作用是4.執行下面程序中的輸出語句后,輸出的結果是()6.在32位處理器上,運行如下程序后p的值為()。10.設有兩字符串“…

C++算法(數據結構)版

C算法(數據結構)版 有些題目不是完整的題目,如需查看完整的題目請移步到acwing的算法基礎課中 文章目錄C算法(數據結構)版單鏈表思路:雙鏈表思路:棧思路:隊列思路:單調棧…

算法訓練營DAY57 第十一章:圖論part07

prim算法精講 53. 尋寶(第七期模擬筆試) 題目描述: 在世界的某個區域,有一些分散的神秘島嶼,每個島嶼上都有一種珍稀的資源或者寶藏。國王打算在這些島嶼上建公路,方便運輸。 不同島嶼之間,…

最短路問題從入門到負權最短路

一,BFS層次最短路/*題目描述 題目描述 給出一個 N 個頂點 M 條邊的無向無權圖,頂點編號為 1~N。 問從頂點 1 開始,到其他每個點的最短路有幾條。 輸入格式 第一行包含 2 個正整數 N,M,為圖的頂點數與邊數。 接下來 M 行&#xff…

AI智能體小白入門指南

AI智能體小白入門指南 ——什么是AI智能體?它們如何工作? 一、AI智能體是什么? AI智能體(AI Agent)是能感知環境、自主決策并執行動作的人工智能系統。 類比理解:像一個“虛擬機器人”或“數字助手”&#…

《設計模式》策略模式

1.策略模式定義 策略模式(Strategy Pattern)是一種行為型設計模式,它定義了一組算法,將每個算法封裝起來,并使它們可以相互替換,從而讓算法的變化獨立于使用它的客戶(Client)。 換…

AWS DMS 深度解析:從遷移任務到復制任務 - 全流程指南與最佳實踐

AWS Database Migration Service (DMS) 是一項強大的云服務,用于在源數據庫和目標數據庫之間安全地遷移數據。其核心優勢在于支持幾乎零停機時間的遷移,這主要歸功于其“變更數據捕獲 (CDC)”功能。理解遷移任務 (Migration Task) 和復制任務 (Replication Task) 的關系與操作…

國企社招 | 中國郵政2025年社會招聘開啟

添加圖片注釋,不超過 140 字(可選) 添加圖片注釋,不超過 140 字(可選) 添加圖片注釋,不超過 140 字(可選) 原文鏈接:“郵”你“政”好 | 廣東郵政2025年社會…

linux添加自啟動

linux添加自啟動 配置步驟: 創建systemd服務文件 sudo nano /etc/systemd/system/tme-vod.service將下面artifact中的內容復制到該文件中。 [Unit] DescriptionTME VOD Service Afternetwork.target[Service] Typesimple Userroot Grouproot WorkingDirectory/data/…

輕量級解決方案:如何高效處理Word轉PDF?

文檔格式轉換時,手動逐個處理總顯得效率低下。它的體積小巧,不到1MB,且無界面設計,運行極簡:將其與Word文件放入同一目錄,雙擊啟動,程序便會自動完成所有文檔的PDF轉換。操作零復雜度&#xff0…

Redis 數據傾斜

Redis 數據傾斜指的是在 Redis 集群模式下,數據(以及相應的訪問請求和負載)在各個分片(Shard)之間分布嚴重不均勻的現象。這會導致部分節點成為熱點或超載,而其他節點資源閑置,最終引發性能瓶頸…

Java基礎-TCP通信(多發多收和一發一收)

目錄 案例要求: 實現思路: 代碼: User:客戶端 Client:服務端 總結: 案例要求: 實現TCP通信的多發多收和一發一收,多發多收去掉各自的while循環就是一發一收,本文只模擬一發一收 實現思路: 客戶端(U…

WinForm 對話框的 Show 與 ShowDialog:阻塞與非阻塞的抉擇

目錄 核心概念:阻塞與非阻塞 Show 與 ShowDialog 的詳細對比 代碼示例:兩種方式的實現差異 使用 Show () 顯示非模態對話框 使用 ShowDialog () 顯示模態對話框 適用場景分析 適合使用 Show () 的場景 適合使用 ShowDialog () 的場景 最佳實踐與…