TCP: 传输控制协议
-
面向数据流(流式套接字)
-
建立连接
-
安全可靠的传输协议
应用场景:HTTP, MQTT, FTP
一.建立连接与断开连接
三次握手(开始)

(1) 三次握手的第二个阶段为什么是 ACK+SYN?
核心目标 :同步序列号 + 确认能力。
TCP 是全双工协议,双方需独立确认发送和接收能力。
SYN 用于交换初始序列号(ISN),ACK 用于确认收到 SYN。
合并原因:
减少网络开销(从 4 次握手优化为 3 次)。
服务器收到 SYN 后必须立即确认(ACK),同时需同步自己的序列号(SYN)。
四次挥手(结束)

(2)四次挥手的确认和结束为什么要分开发送?
核心目标 :非对称关闭 + 数据传输可能性。
一方可能仍有数据需要发送(如 HTTP 响应剩余部分)。
FIN 表示"无数据发送",ACK 表示"已收到 FIN"。
分开发送原因:
被动关闭方可能无法立即停止发送数据。
合并 FIN+ACK 会导致被动关闭方无法完成剩余数据传输。
二.函数接口
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能:建立连接
参数:
sockfd:套接字
sockaddr *addr 服务端地址
addrlen 地址大小
返回值:成功:0 失败:-1
ssize_t send(int sockfd, const void *buf, size_t len, int flags);功能:发送数据。
参数:
sockfd:套接字文件描述符。
buf:数据缓冲区首地址。
len:数据长度。
flags:默认设为 0。
返回值:
成功:发送的字节数。
失败:-1
ssize_t recv(int sockfd, void *buf, size_t len, int flags);功能:从 TCP 套接字接收数据。
参数:
sockfd:套接字文件描述符。
buf:保存接收数据的缓冲区首地址。
len:期待接收的字节数。
flags:默认设为 0。
返回值:
成功:实际接收的字节数。
发送端关闭时:返回 0。
失败:-1
int listen(int sockfd, int backlog);
- 功能:监听三次握手请求。
- 参数:
sockfd
:套接字文件描述符。backlog
:等待处理的三次握手请求的最大数量。- 返回值:
- 成功:0。
- 失败:-1
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);功能:处理三次握手队列中的第一个请求,创建新套接字。
参数:
sockfd:套接字文件描述符。
addr:保存客户端 IP 地址的缓冲区首地址。
addrlen:IP 地址长度。
返回值:
成功:新套接字文件描述符。
失败:-1
三.TCP黏包问题
-
TCP在接收数据时,多包数据粘在了一起
-
原因:
(1)TCP发送数据时,没有及时发走,会根据缓冲区数据的情况进行重新组包;
(2) TCP接收方,没有及时读走缓冲区数据,导致缓冲区大量数据缓存。
- 如何解决TCP粘包:
(1) 发指定大小字节(结构体)
struct data
{
int id;
float tmp;
xxx;
};
指定在相同平台上使用,注意结构体对其齐问题。
(2)发送具有指定分隔符的数据
"hello world\n"
"how are you\n"
(3)封装自定义数据帧
AA 0d 01 00 00 00 14 00 00 00 15 xx xx xx xx sum BB
有固定的帧头和帧尾(AA和BB),有效数据长度0d(避免数据中出现和帧尾一样的有效数据),校验和(sum)(8位和校验/16位和校验)
四.网络抓包:抓取通过设备网卡的数据
wireshark:网络抓包工具:
-
分析和追踪网络问题
-
查看网络协议栈
安装:sudo apt-get install wireshark
-
sudo wireshark
-
选择通信设备的网卡---》any
-
选择抓取的过滤条件
-
开始抓取
-
进行一次通信
五. TCP报文头
标志位:
-
URG: 紧急指针标志, 为1时表示紧急指针有效, 该报文应该优先传送。
-
ACK: 确认应答标志
-
PSH: 表示发送数据,提示接收端从TCP接收缓冲区中读走数据,为接收后续数据腾出空间
-
RST: 重置连接标志
-
SYN: 表示请求建立一个连接
-
FIN: finish标志, 表示释放连接

六.TCP机制
- 应答机制:为每个数据增加序列号,发送数据时,第一个数据的序号作为报文中的序号。
接收方收到相关数据,会回应ACK报文,报文中的确认号是接收方下次希望接收到的数据的起始序号。
-
超时重传机制:TCP发送数据后会在一定的时间内等待ACK,假设在指定时间ACK未收到,则视这包数据已经丢失,会重新传输这包数据。
-
流量控制机制:根据接收方接收数据的能力,调整窗口大小,通知发送发进行流量控制
-
滑动窗口机制:
-
延时应答机制:
-
捎带应答机制: