C语言--day31

TCP粘包问题

  • 粘包:接收端应用层收到的数据多包数据粘连在一起

粘包的原因

  1. 由于发送和接收速率不匹配,导致接收缓冲区缓存了多包数据,应用层读取时,一次性读出
  2. 发送端发送数据时将多包数据重新组包

粘包的解决方法

  • 收发指定大小
cs 复制代码
结构体
struct data
{
        int id;
        long num;
};

//64位 16
//32位 8

注意:注意结构体在不同平台上字节数不一致问题

  • 每包数据增加分隔符,应用层根据分隔符解析

"hello word\n" "how are you\n"

  • 带有帧头帧尾的自定义协议,应用层根据协议精准解析
cs 复制代码
帧头 数据长度 数据 校验和 帧尾
常用帧头和帧尾:
7E
5A A5
EB90
常用校验方式
8位和校验
16和校验
CRC校验

AA 07 01 02 03 BB 05 06 07 sum BB
AA 0A 02 03 05 06 08 09 10 1A 2B 3C sum BB
AA 07 01 02 03 BB 05 06 07 sum BB AA 0A 02 03 05 06 08 09 10 1A 2B 3C
sum BB
  • TCP报文头部
  • TCP机制
确保安全可靠的机制:
  • 应答机制:TCP对于发送的任意一包数据都有应答。发送数据时,TCP头部的序列号表示这包数据的第一个字节的编号;ACK响应时,会将确认号置位,填充成收到的收据的最后一个字节序号+1。
  1. 超时重传机制:等待应答超时时,数据会被重新发送
  2. 流量控制机制:发送发会根据响应报文头部的窗口大小,动态调整发送速率。
  3. 滑动窗口机制:发送端会将已发送已收到应答,已发送未收到应答,以及即将放松的数据缓存在滑动串口。
  • 提高效率机制:
  1. 延迟应答机制:可以在发送的同时等待应答。
  2. 捎带应答机制:TCP的应答有时可以和对方发送的正文数据一同发出

HTTP协议

  • 万维网(WWW):大规模的,联机式的信息储藏所

万维网客户端和服务端如何通信:

  • 万维网服务器如何区分万维网数据--->>url
  • 万维网客户端和万维网服务器怎么通信--->>http
  • 万维网客户端请求数据的格式 --->>html-->超文本标记语言
URL:统一资源定位符
  • 一般格式:
cs 复制代码
https://www.baidu.com/s?
wd=%E6%A2%85%E8%A5%BF%E4%B8%96%E7%95%8C%E6%B3%A2%E7%A0%B4%E9%97%A8&sa=fyb_n_home
page&rsv_dl=fyb_n_homepage&from=super&cl=3&tn=baidutop10&fr=top1000&rsv_idx=2&hi
sfilter=1
  • 端口可省略。
  • HTTP :默认端口:80
  • HTTPS:默认端口:443
  • ?参数&参数
  • 参数:键值对
  • 关键字=值

HTTP协议

  • HTTP: 超文本传输协议,应用层
  • 基于传输层的TCP协议
HTTP的工作流程
HTTP报文格式
  • 例如:使用抓包工具抓取的报文:
cs 复制代码
请求报文:
GET / HTTP/1.1\r\n
Host: news.sohu.com\r\v
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


响应报文:
HTTP/1.1 200 OK\r\n
Date: Wed, 17 Jun 2026 07:24:29 GMT\r\n
Content-Type: text/html;charset=utf-8\r\n
Server: openresty
Vary: Accept-Encoding
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Trace-Id: 99dc9d84e1064593b9ce423e481768c0.97150.17816810696338415
Data-Source: 
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
S-REQ-ID: 8848949218722638101
S-REQ-TYPE: 0
X-Cache-Lookup: Cache Miss
Content-Encoding: gzip
Cache-Control: no-cache
Transfer-Encoding: chunked
X-NWS-LOG-UUID: 8848949218722638101
Connection: keep-alive\r\n            // -----长连接
X-Cache-Lookup: Cache Miss\r\n
\r\n
<!DOCTYPE html><html lang=zh-CN><head><script>


Connection: keep-alive\r\n         // -----长连接:服务端不会立马断开连接,会保持连接一定时间
Connection: close\r\n             //  -----短连接:服务端立马断开连接
HTTP的请求方法
HTTP的常用状态码