Linux12-UDP\TCP

📚 TCP/UDP 核心知识点总结

一、UDP

1. 特点

  • 无连接:无需建立连接即可发送数据。
  • 不可靠:不保证数据顺序或完整性。
  • 低延迟:适合实时性要求高的场景。

2. 应用场景

  • 视频/音频流传输(如直播)。
  • DNS 查询、在线游戏。

二、TCP

1. 特点

  • 面向连接:通过三次握手建立连接。
  • 可靠传输:通过序列号SYN、ACK 确认和重传机制保证数据完整性。
  • 流量控制:滑动窗口机制避免网络拥塞。

三、TCP 三次握手与四次挥手

🔍 为什么三次握手的第二个阶段是 ACK+SYN,而四次挥手的确认和结束要分开发送?

🌟 1. 三次握手的第二个阶段为什么是 ACK+SYN
  • 核心目标:同步序列号 + 确认能力。
    • TCP 是全双工协议,双方需独立确认发送和接收能力。
    • SYN 用于交换初始序列号(ISN),ACK 用于确认收到 SYN
  • 合并原因
    • 减少网络开销(从 4 次握手优化为 3 次)。
    • 服务器收到 SYN 后必须立即确认(ACK),同时需同步自己的序列号(SYN)。
🌟 2. 四次挥手的确认和结束为什么要分开发送?
  • 核心目标:非对称关闭 + 数据传输可能性。
    • 一方可能仍有数据需要发送(如 HTTP 响应剩余部分)。
    • FIN 表示“无数据发送”,ACK 表示“已收到 FIN”。
  • 分开发送原因
    • 被动关闭方可能无法立即停止发送数据。
    • 合并 FIN+ACK 会导致被动关闭方无法完成剩余数据传输。
🌟 3. 关键差异总结

方面三次握手四次挥手
目标双向同步序列号 + 确认能力非对称关闭连接
SYN/FIN 的角色同步初始序列号(必须立即确认)请求关闭连接(可能延迟发送)
ACK 的角色确认 SYN(必须立即发送)确认 FIN(可能延迟发送)
合并的必要性合并为 SYN+ACK 减少开销无法合并,因 FIN 和 ACK 发送时机不同

四、TCP 相关函数

1. send 函数

ssize_t send(int sockfd, const void *buf, size_t len, int flags);
  • 功能:发送数据。
  • 参数
    • sockfd:套接字文件描述符。
    • buf:数据缓冲区首地址。
    • len:数据长度。
    • flags:默认设为 0。
  • 返回值
    • 成功:发送的字节数。
    • 失败:-1。

2. recv 函数

ssize_t recv(int sockfd, void *buf, size_t len, int flags);
  • 功能:从 TCP 套接字接收数据。
  • 参数
    • sockfd:套接字文件描述符。
    • buf:保存接收数据的缓冲区首地址。
    • len:期待接收的字节数。
    • flags:默认设为 0。
  • 返回值
    • 成功:实际接收的字节数。
    • 发送端关闭时:返回 0。
    • 失败:-1。

3. listen 函数

int listen(int sockfd, int backlog);
  • 功能:监听三次握手请求。
  • 参数
    • sockfd:套接字文件描述符。
    • backlog:等待处理的三次握手请求的最大数量。
  • 返回值
    • 成功:0。
    • 失败:-1。

4. accept 函数

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
  • 功能:处理三次握手队列中的第一个请求,创建新套接字。
  • 参数
    • sockfd:套接字文件描述符。
    • addr:保存客户端 IP 地址的缓冲区首地址。
    • addrlen:IP 地址长度。
  • 返回值
    • 成功:新套接字文件描述符。
    • 失败:-1。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值