TCP概念+模擬tcp服務器及客戶端

目錄

一、TCP基本概念

二、ser服務器代碼

三、cil客戶端代碼?

四、面試常問問題

4.1?TCP的可靠性怎么保證或怎么實現?

4.2 具體說一下滑動窗口


一、TCP基本概念

TCP(Transmission Control Protocol,傳輸控制協議)是一種面向連接的、可靠的、基于字節流的傳輸層協議。以下是TCP的一些基本概念:

  1. 面向連接:在數據傳輸之前,TCP在發送方和接收方之間建立一個連接。數據傳輸完成后,連接被釋放。

  2. 可靠性:TCP提供可靠的數據傳輸,確保數據按照正確的順序到達目的地,并且可以檢測和糾正傳輸過程中出現的錯誤。

  3. 流控制:TCP使用滑動窗口協議進行流量控制,以確保發送端和接收端之間的數據傳輸速率合理,不會發生數據丟失或超負荷的情況。

  4. 擁塞控制:TCP通過控制數據包的發送速率來避免網絡擁塞,以確保網絡的穩定性和流暢性。

  5. 分段和重組:TCP在傳輸數據時會將數據分成較小的數據段進行傳輸,接收方收到數據后會重新組裝成完整的數據。

  6. 端到端通信:TCP是端到端通信協議,意味著通信雙方直接進行數據傳輸,而不需要經過中間設備的處理。

服務端:

1. socket():創建一個新的套接字。
2. bind(ip+port):將套接字綁定到指定的IP地址和端口號上,以便監聽來自該地址和端口的連接請求。
3. listen():使套接字進入監聽狀態,等待客戶端的連接請求。
4. accept():接受客戶端的連接請求,建立連接。
5. recv():接收來自客戶端的數據。
6. send():向客戶端發送數據。
7. close():關閉套接字,結束通信。

客戶端:

1. socket():創建一個新的套接字。
2. connect(ip+port):向服務端的指定IP地址和端口號發起連接請求。
3. send():向服務端發送數據。
4. recv():接收來自服務端的數據。
5. close():關閉套接字,結束通信。

TCP編程流程:

1.TCP服務器端編程流程:socket創建套接字->bind綁定IP和端口->listen創建監聽隊列->accept接受連接->receive接收數據->send發送數據->close關閉連接。

2.TCP客戶端編程流程:socket創建套接字->connect發起連接->send發送數據->receive接收數據->close關閉連接。

二、ser服務器代碼

TCP服務器程序,用于接受客戶端的連接請求,并與客戶端進行數據交換 。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>int main()
{//創建套接字(打開文件,文件描述符) 套接字可以通過網絡收發數據int sockfd=socket(AF_INET,SOCK_STREAM,0);if(sockfd==-1){exit(1);}struct sockaddr_in saddr,caddr;//服務器的ip端口memset(&saddr,0,sizeof(saddr));//清空saddr.sin_family=AF_INET;//填充saddr.sin_port=htons(6000);//制定端口號為6000    小于1024是知名端口,1024~4096是保留的端口,4096以上是臨時端口saddr.sin_addr.s_addr=inet_addr("127.0.0.1");//指定ip+端口int res=bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));//綁定,指定應用程序使用的ip及端口if(res==-1){printf("bind err\n");exit(1);}res=listen(sockfd,5);if(res==-1){exit(1);}while(1){int len=sizeof(caddr);//accept接受連接,如果沒人連接,則阻塞int c=accept(sockfd,(struct sockaddr*)&caddr,&len);if(c<0){break;}printf("accept c=%d\n",c);pid_t pid=fork();if(pid==0){while(1){char buff[128]={0};int n=recv(c,buff,127,0);//接受連接,接收數據,會阻塞,也可以換成read()if(n<=0){break;}printf("recv:%s\n",buff);send(c,"ok",2,0);//發送數據,也可以換成write()}printf("client close\n");close(c);exit(0);}close(c);}
}
  1. 導入頭文件:程序中導入了一些標準的頭文件,包括stdio.h、stdlib.h、unistd.h、string.h、sys/socket.h、netinet/in.h、arpa/inet.h。

  2. 創建套接字:使用socket函數創建一個套接字,同樣指定協議族(AF_INET,表示IPv4)、套接字類型(SOCK_STREAM,表示TCP流套接字)和協議參數(0)。

  3. 設置服務器地址:定義了兩個結構體變量saddr和caddr,分別表示服務器和客戶端地址。初始化saddr,并指定服務器的IP地址為"127.0.0.1",端口號為6000。

  4. 綁定地址:使用bind函數將套接字和服務器地址綁定在一起,指定服務器應用程序使用的IP地址和端口號。

  5. 監聽連接:使用listen函數監聽連接請求,指定最大連接數為5。

  6. 接受連接:通過accept函數接受客戶端的連接請求。如果有客戶端連接,則創建一個新的套接字描述符c,并接受連接。

  7. 多進程處理:在子進程中處理客戶端的數據通信。在處理數據的循環中,接收客戶端發送的數據,如果接收到數據則打印并發送"ok"回復客戶端。如果接收到的數據長度小于等于0,表示客戶端關閉連接,則跳出處理數據的循環,關閉客戶端的套接字描述符c。

  8. 多進程處理:在父進程中關閉已接受的客戶端連接。

三、cil客戶端代碼?

客戶端程序,用于連接到服務器并進行數據交換。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>int main()
{//創建套接字int sockfd=socket(AF_INET,SOCK_STREAM,0);if(sockfd==-1){exit(1);}struct  sockaddr_in saddr;//指定服務器的ip和端口portmemset(&saddr,0,sizeof(saddr));saddr.sin_family=AF_INET;saddr.sin_port=htons(6000);//htons 轉為網絡字節序列  大端saddr.sin_addr.s_addr=inet_addr("127.0.0.1");int res=connect(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));if(res==-1){printf("connect err\n");exit(1);}char buff[128]={0};printf("input:\n");fgets(buff,128,stdin);send(sockfd,buff,strlen(buff)-1,0);//可以用writememset(buff,0,sizeof(buff));recv(sockfd,buff,127,0);printf("buff=%s\n",buff);close(sockfd);exit(0);
}
  1. 導入頭文件:程序中導入了一些標準的頭文件,包括stdio.h、stdlib.h、unistd.h、string.h、sys/socket.h、netinet/in.h、arpa/inet.h。

  2. 創建套接字:使用socket函數創建一個套接字,同樣指定協議族(AF_INET,表示IPv4)、套接字類型(SOCK_STREAM,表示TCP流套接字)和協議參數(0)。

  3. 設置服務器地址:定義了一個結構體變量saddr,表示服務器地址。初始化saddr,并指定服務器的IP地址為"127.0.0.1",端口號為6000。

  4. 連接服務器:使用connect函數連接服務器,將套接字和服務器地址綁定在一起,連接到指定的服務器IP和端口。

  5. 發送和接收數據:提示用戶輸入數據,通過fgets函數讀取用戶輸入的數據到緩沖區buff中。然后使用send函數將數據發送給服務器,發送的數據長度為輸入長度減去換行符。接收服務器返回的數據,使用recv函數將數據讀取到buff中。

  6. 打印數據:將接收到的數據打印輸出。

  7. 關閉連接:使用close函數關閉套接字,結束客戶端程序。

運行結果:

四、面試常問問題

4.1?TCP的可靠性怎么保證或怎么實現?

答:1.應答確認,超時重傳。

? ? ? ? 2.亂序重拍,去重。

? ? ? ? 3.滑動窗口,流量控制。

4.2 具體說一下滑動窗口

????????TCP (Transmission Control Protocol) 中的滑動窗口是一種流量控制和可靠傳輸的機制。它允許發送方在發送數據時一次傳輸多個數據包而不需要等待確認,從而提高了網絡的效率。滑動窗口的大小取決于接收方和發送方之間的協商,受限于網絡帶寬、延遲等因素。

????????在 TCP 的滑動窗口中,接收方會發送一個窗口大小的值給發送方,表示能夠接收的數據量。發送方根據這個窗口大小來控制發送的數據量,確保不會超出接收方的處理能力。一旦發送方發送了窗口大小的數據之后,就需要等待接收方發送確認信息(ACK)才能發送下一批數據。

????????通過滑動窗口機制,TCP 實現了可靠的數據傳輸。如果發送方未收到接收方的確認信息,發送方會重新發送相應的數據,直到接收方正確接收。這樣可以保證數據傳輸的正確性和完整性。

????????總的來說,TCP 中的滑動窗口對于保證數據的可靠傳輸起著至關重要的作用,通過有效地控制數據流量和協商窗口大小,可以提高網絡的吞吐量和傳輸效率。

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

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

相關文章

Cocos Creator 自動圖集資源 (Auto Atlas)使用注意事項

1、游戲打包時&#xff0c;自動圖集設置選項中&#xff0c;默認會刪除無關聯的圖片 2、自動圖集設置中&#xff0c;就算勾除(Remove unused ImageAsset from the Bundle)的功能&#xff0c;無關聯的圖片也不會打包進入圖集之中&#xff0c;會獨立存在打包的游戲中。 3、使用自動…

PyTorch 2.0編譯器技術深度解析:如何自動生成高性能CUDA代碼

引言&#xff1a;編譯革命的范式轉移 PyTorch 2.0的torch.compile不僅是簡單的即時編譯器&#xff08;JIT&#xff09;&#xff0c;更標志著深度學習框架從?解釋執行?到?編譯優化?的范式躍遷。本文通過逆向工程編譯過程&#xff0c;揭示PyTorch如何將動態圖轉換為高性能CU…

【AI面試準備】從0-1搭建人工智能模型自動化評估理論與測試,掌握測試數據集建立與優化,熟練數據處理和模型評測工作

面試要求&#xff1a;從0-1搭建人工智能模型自動化評估理論與測試&#xff0c;掌握測試數據集建立與優化&#xff0c;熟練數據處理和模型評測工作。 以下是針對從0-1搭建AI模型自動化評估體系的系統化知識總結&#xff0c;涵蓋核心方法論、技術棧、高頻考點及面試回答模板&…

【Linux應用】在PC的Linux環境下通過chroot運行ARM虛擬機鏡像img文件(需要依賴qemu-aarch64、不需要重新安裝iso)

【Linux應用】在PC的Linux環境下通過chroot運行ARM虛擬機鏡像img文件&#xff08;需要依賴qemu-aarch64、不需要重新安裝iso&#xff09; qemu提供了運行ARM虛擬機的方法 具體的操作方式就是建立一個硬盤img 然后通過iso安裝到img 最后再運行img即可 這種方式教程很多 很簡單 …

OpenCv實戰筆記(1)在win11搭建opencv4.11.1 + qt5.15.2 + vs2019_x64開發環境

一. 準備工作 Visual Studio 2019&#xff08;安裝時勾選 C 桌面開發 和 Windows 10 SDK&#xff09; CMake 3.20&#xff08;官網下載&#xff09; Qt 5.15.2&#xff08;下載 Qt Online Installer&#xff09;安裝時勾選 MSVC 2019 64-bit 組件。 opencv 4.11.1 源碼下載 git…

springboot+mysql+element-plus+vue完整實現汽車租賃系統

目錄 一、項目介紹 二、項目截圖 1.項目結構圖 三、系統詳細介紹 管理后臺 1.登陸頁 2.管理后臺主頁 3.汽車地點管理 4.汽車類別 5.汽車品牌 6.汽車信息 7.用戶管理 8.舉報管理 9.訂單管理 10.輪播圖管理 11.交互界面 12.圖表管理 汽車租賃商城 1.首頁 2.汽…

【算法筆記】動態規劃基礎(二):背包dp

目錄 01背包例題狀態表示狀態計算初始化AC代碼 完全背包例題狀態表示狀態計算初始化TLE代碼 多重背包例題狀態表示狀態計算初始化AC代碼 分組背包例題狀態表示狀態計算初始化AC代碼 二維費用背包例題狀態表示狀態計算初始化AC代碼 混合背包問題例題狀態表示狀態計算初始化TLE代…

Qt Quick Design 下載社區版

官方地址&#xff1a;Qt Design Studio - UI Development Tool for Applications & Devices 社區版只能用于開源軟件的開發 按圖所示下載或直接跳轉到下載頁面&#xff1a;Download Qt OSS: Get Qt Online Installerhttps://www.qt.io/download-qt-installer-oss 選Try …

深入理解CSS盒子模型

一、盒子模型的核心概念 CSS盒子模型&#xff08;Box Model&#xff09;是網頁布局的基石&#xff0c;每個HTML元素都可以看作一個矩形盒子&#xff0c;由四個同心區域構成&#xff1a; 內容區&#xff08;Content&#xff09; 內邊距&#xff08;Padding&#xff09; 邊框&a…

Python項目源碼57:數據格式轉換工具1.0(csv+json+excel+sqlite3)

1.智能路徑處理&#xff1a;自動識別并修正文件擴展名&#xff0c;根據轉換類型自動建議目標路徑&#xff0c;實時路徑格式驗證&#xff0c;自動補全缺失的文件擴展名。 2.增強型預覽功能&#xff1a;使用pandastable庫實現表格預覽&#xff0c;第三方模塊自己安裝一下&#x…

數據庫MySQL學習——day9(聚合函數與分組數據)

文章目錄 1. 聚合函數1.1 COUNT() 函數1.2 SUM() 函數1.3 AVG() 函數1.4 MIN() 函數1.5 MAX() 函數 2. GROUP BY 子句2.1 使用 GROUP BY 進行數據分組2.2 結合聚合函數 3. HAVING 子句3.1 使用 HAVING 過濾分組數據3.2 HAVING 和 WHERE 的區別 4. 實踐任務4.1 創建一個銷售表4.…

數據管理能力成熟度評估模型(DCMM)全面解析:標準深度剖析與實踐創新

文章目錄 一、DCMM模型的戰略價值與理論基礎1.1 DCMM的本質與戰略定位1.2 DCMM的理論基礎與創新點 二、DCMM模型的系統解構與邏輯分析2.1 八大能力域的有機關聯與系統架構2.2 五級成熟度模型的內在邏輯與演進規律 三、DCMM八大能力域的深度解析與實踐創新3.1 數據戰略&#xff…

Docker搜索鏡像報錯

科學上網最方便。。。。 主要是鏡像的問題 嘗試一&#xff1a; 報錯處理 Error response from daemon: Get https://index.docker.io/v1/search?qmysql&n25: dial tcp 31.13.84.2:443: i/o timeout Error response from daemon: Get https://index.docker.io/v1/se…

ERP系統源碼,java版ERP管理系統源碼,云端ERP

一套開箱即用的云端ERP系統源代碼&#xff0c;小型工廠ERP系統源碼 SaaS ERP是一套開箱即用的云端ERP系統&#xff0c;有演示&#xff0c;開發文檔&#xff0c;數據庫文檔齊全&#xff0c;自主版權落地實例&#xff0c;適合項目二開。 SaaS ERP具有高度的靈活性和可擴展性&am…

Sliding Window Attention(Longformer)

最簡單的自注意力大家肯定都會啦。 但這種全連接的自注意力&#xff08;即每個 token 需要 attend 到輸入序列中的所有其他 token&#xff09;計算與內存開銷是 O ( n 2 ) O(n^2) O(n2) 。為了緩解這個問題&#xff0c;研究者們提出了 Sliding Window Attention。 Sliding W…

在Window10 和 Ubuntu 24.04LTS 上 Ollama 在線或離線安裝部署

Ollama 是一個開源的大型語言模型&#xff08;LLM&#xff09;服務框架&#xff0c;旨在通過輕量化、跨平臺的設計&#xff0c;簡化大模型在本地環境中的部署與應用。其基于 Go 語言開發&#xff0c;通過 Docker 容器化技術封裝模型運行環境&#xff0c;提供類似命令行工具的交…

在Ubuntu系統中安裝桌面環境

在 Ubuntu 系統中安裝桌面環境可以通過包管理器 apt 或工具 tasksel 實現。以下是詳細的安裝方法和常見桌面環境的選擇&#xff1a; --- ### **1. 準備系統更新** 在安裝前&#xff0c;建議更新軟件源和系統包&#xff1a; bash sudo apt update && sudo apt upgrade…

【云備份】服務端業務處理模塊設計與實現

目錄 一. 業務處理模塊的任務 二. 網絡通信接口設計 2.1.文件上傳 2.2.展示頁面獲取 2.3.文件下載 三.業務處理類設計 3.1.業務處理類的代碼框架編寫 3.2.文件上傳代碼編寫 3.3.展示頁面的獲取代碼編寫 3.4.文件下載代碼編寫——下載篇 3.4.文件下載代碼編寫——斷…

基于SpringBoot的漫畫網站設計與實現

1.1項目研究的背景 困擾管理層的許多問題當中,漫畫信息管理一定是不敢忽視的一塊。但是管理好漫畫網站又面臨很多麻煩需要解決,如何在工作瑣碎,記錄繁多的情況下將漫畫網站的當前情況反應給相關部門決策等等。在此情況下開發一款漫畫網站&#xff0c;于是乎變得非常合乎時宜。…

學習記錄:DAY22

假日尾聲&#xff1a;技術進階與自我反思 前言 于是&#xff0c;假日迎來了它的尾聲&#xff0c;把快樂和焦躁都留存在昨天。 我只覺情感的自相矛盾在加重&#xff0c;學習讓我焦躁&#xff0c;縱欲無法填補空虛&#xff0c;于是我的心被拖入了無止盡的拉扯中。 我還沒有找到必…