网络(TCP)

TCP: 传输控制协议

  1. 面向数据流(流式套接字)

  2. 建立连接

  3. 安全可靠的传输协议

应用场景: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黏包问题

  1. TCP在接收数据时,多包数据粘在了一起

  2. 原因:

(1)TCP发送数据时,没有及时发走,会根据缓冲区数据的情况进行重新组包;

(2) TCP接收方,没有及时读走缓冲区数据,导致缓冲区大量数据缓存。

  1. 如何解决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:网络抓包工具:

  1. 分析和追踪网络问题

  2. 查看网络协议栈

安装:sudo apt-get install wireshark

  1. sudo wireshark

  2. 选择通信设备的网卡---》any

  3. 选择抓取的过滤条件

  4. 开始抓取

  5. 进行一次通信

五. TCP报文头

标志位:

  1. URG: 紧急指针标志, 为1时表示紧急指针有效, 该报文应该优先传送。

  2. ACK: 确认应答标志

  3. PSH: 表示发送数据,提示接收端从TCP接收缓冲区中读走数据,为接收后续数据腾出空间

  4. RST: 重置连接标志

  5. SYN: 表示请求建立一个连接

  6. FIN: finish标志, 表示释放连接

六.TCP机制

  1. 应答机制:为每个数据增加序列号,发送数据时,第一个数据的序号作为报文中的序号。

接收方收到相关数据,会回应ACK报文,报文中的确认号是接收方下次希望接收到的数据的起始序号。

  1. 超时重传机制:TCP发送数据后会在一定的时间内等待ACK,假设在指定时间ACK未收到,则视这包数据已经丢失,会重新传输这包数据。

  2. 流量控制机制:根据接收方接收数据的能力,调整窗口大小,通知发送发进行流量控制

  3. 滑动窗口机制:

  4. 延时应答机制:

  5. 捎带应答机制: