Linux應用軟件編程---網絡編程(TCP:[ 其他機制、頭部標志位、應用示例 ]、 HTTP:[ 萬維網、概念、格式、報文、應用示例 ]

一、TCP 網絡協議補充內容

1、TCP 的其他機制

? ? 1)TCP 頭部的標志位

? ? ? ? TCP 頭部可用抓包工具 (wireshark) 來查看。

頭部標志位用途
SYN請求建立連接標志位
ACK響應報文標志位
PSH攜帶數據標志位,通知接收方該從緩沖區讀數據
FIN請求斷開連接標志位
RST復位標志位
URG緊急數據標志位

? ? ? ? TCP 各部分所占字節數:

2、機制

? ? 1)安全可靠

? ? ?(1)三次握手和四次揮手機制
(2)應答機制:TCP對于每一包數據都會給出相應的應答。發送數據時序列號表示這包數據的起始編號,響應報文中的確認號是接收方收到的最后一個字節編號+1。

? ? ?(3)超時重傳機制:當數據發送出去等待指定時間沒有收到響應,此時認為這包數據丟失則進行沖傳。

? ? ?(4)滑動窗口機制:一段緩沖區,緩存TCP已發送未收到響應,準備發送等數據

? ? 2)提高效率

? ? ?(1)延遲應答機制:發送數據的同時可以等待應答
(2)流量控制機制:結合TCP頭部的窗口大小,動態調整發送速率。
(3)捎帶應答機制:ACK報文可能和應用層的數據同時發送

3、應用示例

? ? 1)使用 TCP 協議實現全雙工聊天

? ? ? ? (1)客戶端代碼

#define SER_PORT 50000
#define SER_IP  "192.168.0.144"//服務端IP地址int init_tcp_cli()
{int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0){perror("socket error");return -1;}struct sockaddr_in seraddr;seraddr.sin_family = AF_INET;seraddr.sin_port = htons(SER_PORT);seraddr.sin_addr.s_addr = inet_addr(SER_IP);int ret = connect(sockfd, (struct sockaddr *)&seraddr, sizeof(seraddr));if (ret < 0){perror("connect error");return -1;}return sockfd;
}int main(int argc, const char *argv[])
{int sockfd = init_tcp_cli();if (sockfd < 0){return -1;}pid_t pid = fork();if (pid > 0){char buff[1024] = {0};while (1){fgets(buff, sizeof(buff), stdin);send(sockfd, buff, strlen(buff), 0);if (0 == strcmp(buff, ".quit\n")){break;}}wait(NULL);}else if (0 == pid){char buff[1024] = {0};while (1){recv(sockfd, buff, sizeof(buff), 0);if (0 == strcmp(buff, ".quit\n")){break;}printf("B--->A : %s\n", buff);}}close(sockfd);return 0;
}

? ? ? ? (2)服務端代碼

#define SER_PORT  50000
#define SER_IP    "192.168.0.144"int init_tcp_ser()
{int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0){perror("socket error");return -1;}struct sockaddr_in seraddr;seraddr.sin_family = AF_INET;seraddr.sin_port = htons(SER_PORT);seraddr.sin_addr.s_addr = inet_addr(SER_IP);int ret = bind(sockfd, (struct sockaddr *)&seraddr, sizeof(seraddr));if (ret < 0){perror("bind error");return -1;}ret = listen(sockfd, 10);if (ret < 0){perror("listen error");return -1;}return sockfd;
}int main(int argc, const char *argv[])
{int sockfd = init_tcp_ser();if (sockfd < 0){return -1;}int connfd = accept(sockfd, NULL, NULL);if (connfd < 0){perror("accept error");return -1;}pid_t pid = fork();if (pid > 0){char buff[1024] = {0};while (1){fgets(buff, sizeof(buff), stdin);send(connfd, buff, strlen(buff), 0);if (0 == strcmp(buff, ".quit\n")){break;}}wait(NULL);}else if (0 == pid){char buff[1024] = {0};while (1){memset(buff, 0, sizeof(buff));recv(connfd, buff, sizeof(buff), 0);if (0 == strcmp(buff, ".quit\n")){break;}printf("A---->B : %s\n", buff);}}close(connfd);close(sockfd);return 0;
}

? ? 2)使用 TCP 協議實現文件拷貝功能

? ? ? ? (1)客戶端代碼

#define SER_PORT 50000
#define SER_IP  "192.168.0.179"int init_tcp_cli()
{int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0){perror("socket error");return -1;}struct sockaddr_in seraddr;seraddr.sin_family = AF_INET;seraddr.sin_port = htons(SER_PORT);seraddr.sin_addr.s_addr = inet_addr(SER_IP);int ret = connect(sockfd, (struct sockaddr *)&seraddr, sizeof(seraddr));if (ret < 0){perror("connect error");return -1;}return sockfd;
}int send_file(int sockfd, const char *filename)
{int fd = open(filename, O_RDONLY);if (fd < 0){perror("open file error");return -1;}char buff[1024] = {0};while (1){ssize_t cnt = read(fd, buff, sizeof(buff));if (cnt <= 0){break;}send(sockfd, buff, cnt, 0);}close(fd);
}int main(int argc, const char *argv[])
{if (argc < 2){printf("Usage : ./a.out <sendfile>\n");return -1;}int sockfd = init_tcp_cli();if (sockfd < 0){return -1;}send_file(sockfd, argv[1]);close(sockfd);return 0;
}

? ? ? ? (2)服務端代碼

#define SER_PORT  50000
#define SER_IP    "192.168.0.179"int init_tcp_ser()
{int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0){perror("socket error");return -1;}struct sockaddr_in seraddr;seraddr.sin_family = AF_INET;seraddr.sin_port = htons(SER_PORT);seraddr.sin_addr.s_addr = inet_addr(SER_IP);int ret = bind(sockfd, (struct sockaddr *)&seraddr, sizeof(seraddr));if (ret < 0){perror("bind error");return -1;}ret = listen(sockfd, 10);if (ret < 0){perror("listen error");return -1;}return sockfd;
}int recv_file(int connfd, const char *filename)
{int fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0664);if (fd < 0){perror("open file error");return -1;}char buff[1024] = {0};while (1){ssize_t cnt = recv(connfd, buff, sizeof(buff), 0);if (0 == cnt){printf("client off\n");break;}else if (cnt < 0){perror("recv error");break;}write(fd, buff, cnt);}close(fd);
}int main(int argc, const char *argv[])
{if (argc < 2){printf("Usage : ./a.out <recvfile>\n");return -1;}int sockfd = init_tcp_ser();if (sockfd < 0){return -1;}int connfd = accept(sockfd, NULL, NULL);if (connfd < 0){perror("accept error");return -1;}recv_file(connfd, argv[1]);close(connfd);close(sockfd);return 0;
}

二、HTTP 協議

1、萬維網 WWW

? ? 1)概念

? ? ? ? WWW 萬維網(Web):稱為世界范圍的廣域網,是一個大規模的、聯機式的信息儲藏方式。

? ? 2)解決的問題

? ???(1)萬維網服務器后臺如何標記萬維網數據 ?? ?

????????????????url : 統一資源定位符
(2)萬維網客戶端與萬維網服務器之前使用什么方式通信:

??????????????? HTTP:超文本傳輸協議
(3)萬維網客戶端如何展示請求的數據:

?????????????? ?HTML:超文本標記語言

2、url 統一資源定位符

? ? 格式:?<協議>://<主機>:<端口>/<路徑>

例如:https://www.baidu.com/?
百度主頁

3、HTTP 協議

? ? 1)概念

? ? ? ? HTTP 協議:稱為超文本傳輸協議,位于應用層。
端口:80
備用端口:8080
基于傳輸層的TCP協議

? ? 2)HTTP 通信過程

????????客戶端通信流程:

????? ? (1)請求建立TCP連接
(2)發送HTTP請求報文
(3)接收HTTP響應報文
(4)斷開連接

? ? 3)HTTP 的報文格式

? ? ? (1)報文分類

? ? ? ? HTTP 有兩類報文:

? ? ? ? 請求報文------從客戶到服務器請求報文,見圖6-12(a)

? ? ? ? 響應報文------從服務端到客戶的回答,見圖6-12(b)

? ? ? ? 由于 HTTP 是面向文本的 ( text-oriented ) ,因此在報文中的每一個字段都是一些 ASCII 碼串,因而每個字段的長度都是不確定的。

? ? ? ? (2)HTTP 請求報文的方法

方法(操作)意義
OPTION請求一些選項的信息
GET請求讀取由 URL 所標志的信息
HEAD請求讀取由 URL 所標志的信息的首部
POST給服務器添加信息(例如,注釋)
PUT在指明的 URL 下存儲一個文檔
DELETE刪除指明的 URL 所標志的資源
TRACE用來進行環回測試的請求報文
CONNECT用于代理服務器

? ? ? ? (3)狀態碼

? ? ? ? ? ? ?狀態碼(Status-Code)都是三位數字的,分為5大類共33種。例如:

1xx表示通知信息的,如請求收到了或正在進行處理
2xx表示成功,如接受或知道了
3xx表示重定向,如要完成請求還必須采取進一步的行動
4xx表示客戶的差錯,如請求中有錯誤的語法或不能完成
5xx表示服務器的差錯,如服務器失效無法完成請求

????????例如,常見的三種狀態行:

? ? ? ? (4)鏈接方式

????????Connection: keep-alive ---> 長連接:連接保持一定時間
Connection: close ---> 短連接:連接立馬斷開

? ? 4)HTTP 舉例

? ? ? ? 訪問 http://news.sohu.com,得到的請求報文與響應報文。

? ? ? ? (1)HTTP 請求報文

請求報文
GET / HTTP/1.1\r\n
Host: news.sohu.com\r\n
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/113.0\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\r\n
Accept-Language: en-US,en;q=0.5\r\n
Connection: keep-alive\r\n
\r\n

? ? ? ? (2)HTTP 響應報文

響應報文
HTTP/1.1 200 OK\r\n
Date: Mon, 25 Aug 2025 06:14:56 GMT\r\n
Content-Type: text/html;charset=utf-8\r\n
Server: openresty\r\n
Vary: Accept-Encoding\r\n
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Trace-Id: 15e6e7862abd49fdb1c327a6dbeb200d.10490.17561024969448219
Data-Source:?
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
S-REQ-ID: 17348448226369344247
S-REQ-TYPE: 0
X-Cache-Lookup: Cache Miss
Content-Encoding: gzip
Cache-Control: no-cache\r\n
Transfer-Encoding: chunked\r\n
X-NWS-LOG-UUID: 17348448226369344247\r\n
Connection: keep-alive\r\n
X-Cache-Lookup: Cache Miss\r\n
\r\n
<!DOCTYPE html><html><head><script>if(window&&window.performance&&typeof window.performance.now==='function'){!window.MptcfePerf?window.MptcfePerf={headst:+new Date()}:window.MptcfePerf.headst=+new Date()}</script><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta http-equiv=x-dns-prefetch-control content=on><meta name

? ? 5)使用響應報文定位網頁

#define SER_PORT 80
#define SER_IP "219.144.82.95"int create_tcp_connect()
{int sockfd = socket(AF_INET, SOCK_STREAM, 0);if(sockfd < 0){perror("socket error");return -1;}struct sockaddr_in seraddr;seraddr.sin_family = AF_INET;seraddr.sin_port = htons(SER_PORT);seraddr.sin_addr.s_addr = inet_addr(SER_IP);int ret = connect(sockfd, (struct sockaddr *)&seraddr, sizeof(seraddr));if(ret < 0){perror("connect error");return -1;}return sockfd;
}int send_http_request(int sockfd)
{char *preq = "GET / HTTP/1.1\r\n""Host: news.sohu.com\r\n""User-Agent: Mozilla/5.0(X11;Ubuntu;Linuxx86_64;rv:109.0)Gecko/20100101 Firefox/113.0\r\n""Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\r\n""Accept-Language: en-US,en;q=0.5\r\n""Connection: close\r\n""\r\n";ssize_t cnt = send(sockfd, preq, strlen(preq), 0);if(cnt < 0){perror("send error");return -1;}return 0;
}int recv_http_respose(int sockfd)
{char buff[1024] = {0};while(1){ssize_t cnt = recv(sockfd, buff, sizeof(buff), 0);if(cnt < 0){perror("recv error");return -1;}else if(0 == cnt){printf("server off\n");break;}write(1, buff, cnt);}return 0;
}int main(void)
{int sockfd = create_tcp_connect();if(sockfd < 0){return -1;}send_http_request(sockfd);recv_http_respose(sockfd);close(sockfd);return 0;
}

?

【END】

?

?

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

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

相關文章

基于開源飛控pix的無人機裝調與測試

文章目錄 前言資源下載1、地面站軟件獨家漢化版QGC地面站&#xff08;推薦&#xff09;原版QGC地面站Mission Planner地面站 2、安裝好環境的虛擬機安裝虛擬機打開虛擬機文件 3、完整的各版本PX4、QGC源碼PX4QGC 一、無人機基本常識/預備知識&#xff08;1&#xff09;無人機飛…

Ubuntu解決makefile交叉編譯的問題

問題1&#xff1a;/usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: cannot find -lwiringpi: No such file or directory 找不到-lwiringpi庫路徑&#xff0c;其實在3rd/usr/lib/aarch64-linux-gnu下沒有libwiringPi.so.2 …

ExcelUtils實現 設置內容 插入行 復制行列格式

ExcelUtils實現&#xff1a;1.實現輸入 例如 2 A 的excel格式&#xff0c;自動填充對應excel單元格&#xff1b;2.實現復制并新增下一行&#xff1b;3.實現控制復制上一行相同列的格式&#xff1b;4.實現控制復制同一行上一列的格式&#xff1b;/*** 在指定行下方插入新行并復…

SQLBot 智能問數、數據洞察邏輯拆解

* 基于 SQLBot v1.0.2* 使用 AI Gateway 抓取模型調用記錄SQLBot 通過融入 LLM 能力實現了非常優秀的問數體驗&#xff0c;這里記錄一下產品中如何引入 AI 能力&#xff0c;順便探究一下調用大模型的數據安全的問題&#xff08;是否會向模型提供真實數據&#xff09;。結論&…

實現統一門戶登錄跳轉免登錄

統一門戶所有應用頁面&#xff0c;點擊跳轉對應業務系統&#xff0c;實現業務系統免登錄//獲取所有業務系統項&#xff08;獲取并存儲到倉庫) //用于頁面展示 let appSubjectVoList ref<any>([]) appSubjectVoList.value userStore.getAppSubjectVoList || [] //登陸后…

卓伊凡的開源戰略與PHP-SG16加密技術深度解析-sg加密技術詳解-卓伊凡

卓伊凡的開源戰略與PHP-SG16加密技術深度解析-sg加密技術詳解-卓伊凡引言&#xff1a;在理想與現實間尋求平衡的開源之路近日&#xff0c;技術創業者卓伊凡先生宣布了一項重大決策&#xff1a;將于明日將其公司旗下的優雅草商城、項目管理系統等眾多成熟商業產品正式開源。這一…

回溯 算法常見面試問題

1. 全排列(無重復元素) 核心思想:交換法避免額外空間 def permute(nums):def backtrack(first=0):if first == len(nums):res.append(nums.copy())returnfor i in range(first, len(nums)):nums[first], nums[i] = nums[i], nums[first]backtrack(first + 1)nums[first], …

營銷專業人員核心能力構建與發展路徑

CDA數據分析師證書含金量高&#xff0c;適應了未來數字化經濟和AI發展趨勢&#xff0c;難度不高&#xff0c;行業認可度高&#xff0c;對于找工作很有幫助。一、營銷人員五維能力模型能力維度核心技能要素工具與方法論產出成果數據驅動決策指標監控、歸因分析、效果優化Google …

Android系統學習2——Android.Utils.Log模塊討論

Android系統學習2——Android.Utils.Log模塊討論 ? 打日志是一個很好的習慣&#xff0c;有的時候我們可以通過這里排查我們的程序的問題。在這里&#xff0c;我們可以從Android的日志機制入手討論我們的Log模塊。 android.util.Log 類的作用 Android 中最常用的日志工具是 and…

使用 YAML 文件,如何優雅地刪除 k8s 資源?

在 Kubernetes 中&#xff0c;刪除資源是日常運維中不可避免的操作。如果你習慣了使用 kubectl create 和 kubectl apply 來創建和更新資源&#xff0c;那么你可能也會想知道如何用同樣基于文件的方式來刪除它們。 雖然你總是可以用 kubectl delete deployment <name> 這…

如何將游戲和軟件移動到另一個驅動器或外部磁盤中

您的C盤存儲空間是否不足&#xff0c;或者您不小心在錯誤的驅動器中安裝了游戲或應用程序。那么使用這個簡單的技巧&#xff0c;您可以輕松的將游戲或應用程序移動到另一個分區或磁盤中。1、找到準備移動的軟件&#xff0c;選擇路徑并復制&#xff1a;2、打開記事本&#xff0c…

賦能汽車電子智造:全星QMS打造品質檢驗、稽核與客訴管理閉環?——全星質量管理軟件系統

全星QMS&#xff1a;驅動汽車電子質量卓越與商業成功的核心引擎 在智能汽車時代&#xff0c;汽車電子的質量已成為產品安全、性能與品牌信譽的核心。面對復雜的供應鏈、嚴苛的IATF 16949/ISO 26262標準及降本增效的壓力&#xff0c;您的企業需要一位數字化戰略伙伴。全星質量管…

【數據結構C語言】順序表

1. 線性表 線性表&#xff08;linear list&#xff09;是n個具有相同特性的數據元素的有限序列。 線性表是一種在實際中廣泛使用的數據結構&#xff0c;常見的線性表&#xff1a;順序表、鏈表、棧、隊列、字符串...線性表在邏輯上是線性結構&#xff0c;也就說是連續的一條直線…

AI 學習路徑-記錄分享

目錄推薦學習資源延申閱讀推薦學習資源 3Blue1Brown的個人空間-3Blue1Brown個人主頁-嗶哩嗶哩視頻 這個簡短的課程有助于了解AI的本質&#xff0c;邁入學習AI的第一步。 歡迎加入 &#x1f917; AI Agents 課程 - Hugging Face Agents Course AI Agent&#xff0c;當前火爆…

Windows Server 2019 上安裝 Ubuntu 20.04 的幾種方式

docker desktop不支持Windows server 2019&#xff0c;所以Windows Server 2019 上安裝 Ubuntu 20.04 變成一種可行的途徑。記錄一下其中可用的幾種方式&#xff1a;&#x1f5c2; 常見安裝方式對比方式原理難度適用場景優點缺點Hyper?V 虛擬機&#xff08;推薦&#xff09;利…

當Trae遇上高德MCP:一次國慶武漢之旅的AI技術實踐

當Trae遇上高德MCP&#xff1a;一次國慶武漢之旅的AI技術實踐 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般絢爛的技術棧中&#xff0c;我是那個永不停歇的色彩收集者。 &#x1f98b; 每一個優化都是我培育的花朵&#xff0c;每一個特性都是我…

設計模式:抽象工廠模式

簡介 抽象工廠模式(Abstract Factory Pattern)是一種創建型設計模式,它提供了一種封裝一組具有共同主題或相關依賴關系的獨立工廠的方式,而無需指定它們的具體類。核心思想是創建一系列相關或相互依賴的對象家族(產品族),可以將客戶端與具體產品的創建過程解耦,使得客…

知行——同為科技24周年慶典

在宜人的金秋時節&#xff0c;北京同為科技有限公司于2025年8月23日&#xff0c;天津基地與江西同時隆重舉辦了以“知行”為主題的周年慶祝活動&#xff0c;回顧企業24年來的奮斗歷程&#xff0c;凝聚“同為人”力量&#xff0c;展望更加光明的未來。當天&#xff0c;創始人周慧…

RK android14 定制ES8388音頻編解碼器雙MIC雙OUT(1)

文章目錄 前言 一、適配內容概述 二、適配步驟 1. HAL層配置修改 1.1 添加聲卡名稱識別 (`audio_hw.c`) 1.2 注冊聲卡路由配置 (`config_list.h`) 1.3 定義路由配置表 (`es8388_config.h`) 2. 內核設備樹修改 2.1 禁用默認聲卡 2.2 配置ES8388聲卡節點 2.3 配置I2C和Codec節點 …

Oracle跟蹤及分析方法

1、SQL_TRACE 通過設置 SQL_TRACE 可以啟用或禁用 SQL 跟蹤工具&#xff0c;設置 SQL_TRACE 為 true 可以收集信息用于性能優化或問題診斷&#xff1b; 特別注意&#xff1a; 全局啟用 SQL 跟蹤可能會對性能產生嚴重影響。 可以使用 ALTER SESSION 跟蹤特定會話。 Oracle 已…