5.TCP
TCP(Transmission Control Protocol):传输控制协议(流式套接字),传输层
1.TCP特点
1.面向数据流
2.面向连接
3.安全可靠的传输协议
4.TCP机制复杂
2.TCP机制
三次握手:TCP建立连接的时候需经过三次握手,确保通讯双方都已经准备就绪。

四次挥手:断开连接,确保通信双方在断开连接前都已经收发数据结束 可以由客户端发起,也可以由服务端发起

3.TCP编程

建立连接connect
cpp
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
功能:请求建立连接
参数:
sockfd:建立连接的套接字
addr:服务端的地址信息
addrlen:服务端地址大小
返回值:
成功:0
失败:-1
监听:listen
cpp
int listen(int sockfd, int backlog);
功能:监听三次握手
参数:
sockfd:监听套接字
backlog:允许同时监听的客户端的最大个数
返回值:
成功:0
失败:-1
接收客户端:accept
cpp
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:接收完成三次握手的客户端
参数:
sockfd:监听套接字
addr:保存接收到的客户端的地址
addrlen:地址信息大小的指针
返回值:
成功:通讯套接字
失败:-1
接收数据:recv
cpp
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:接收套接字上的数据
参数 :
sockfd:套接字
buff:存放接收到的数据
len:期望读到的字节数
flags:标志:0 默认方式
返回值:
成功:实际收到的字节数
失败:-1
对方关闭套接字:0
4.TCP粘包问题
粘包:接收端应用层收到的数据多包数据粘连在一起。
原因:
1.由于发送和接收速率不匹配,导致接收缓冲区缓存了多包数据,应用层读取时,一次性读出
2.发送端发送数据时将多包数据重新组包
解决方法:
1.收发指定大小 结构体
struct data
{
int id;
long num;
};
注意:注意结构体在不同平台上字节数不一致问题 //64位 16 //32位 8
2.每包数据增加分隔符,应用层根据分隔符解析 "hello word\n" "how are you\n"
3.带有帧头帧尾的自定义协议,应用层根据协议精准解析
cpp
帧头 数据长度 数据 校验和 帧尾
常用帧头和帧尾:
7E
5A A5
EB90
常用校验方式
8位和校验
16和校验
CRC校验
cpp
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
5.TCP报文头部

6.TCP机制
确保安全可靠的机制:
应答机制:TCP对于发送的任意一包数据都有应答。发送数据时,TCP头部的序列号表示这
包数据的第一个字节的编号;ACK响应时,会将确认号置位,填充成收到的收据的最后一个
字节序号+1。
超时重传机制:等待应答超时时,数据会被重新发送
流量控制机制:发送发会根据响应报文头部的窗口大小,动态调整发送速率。
滑动窗口机制:发送端会将已发送已收到应答,已发送未收到应答,以及即将放松的数据缓
存在滑动串口。
提高机制:
延迟应答机制:可以在发送的同时等待应答。
捎带应答机制:TCP的应答有时可以和对方发送的正文数据一同发出
6.HTTP协议
万维网(WWW):大规模的,联机式的信息储藏所。
万维网客户端和服务端如何通信:
万维网服务器如何区分万维网数据---》url
万维网客户端和万维网服务器怎么通信---》http
万维网客户端请求数据的格式 -------------》html-->超文本标记语言
1.URL:统一资源定位符
一般格式:

cpp
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_homepage&rsv_dl=fyb_n_homepage&from=super&cl=3&tn=baidutop10&fr=top1000&rsv_idx=2&hisfilter=1
端口可省略。
HTTP:默认端口:80 HTTPS:默认端口:443
?参数&参数
参数:键值对 关键字=值
2.HTTP协议
HTTP: 超文本传输协议,应用层 基于传输层的TCP协议
HTTP的工作流程

HTTP报文格式

例如:使用抓包工具抓取的报文:
请求报文:
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的常用状态码
