Linux TCP网络

一、TCP传输核心机制

TCP是面向连接的可靠传输协议,通信建立、数据传输、连接断开都有固定流程。

  1. 三次握手

通信开始前通过三次握手建立可靠连接。

  1. 发送端发送SYN报文,请求建立连接
  2. 接收端回复ACK+SYN,确认收到请求,同时向对方发起连接请求
  3. 发送端回复ACK,连接正式建立

握手完成之后双方才可以收发业务数据。

  1. 四次挥手

完成数据传输之后,使用四次挥手断开连接。

  1. 主动关闭方发送FIN,表示本方不再发送数据
  2. 被动关闭方回复ACK,确认收到关闭请求,此时被动方还可以继续把剩余数据发完
  3. 被动关闭方数据发送完毕,发送FIN
  4. 主动关闭方回复ACK,连接彻底释放

补充:如果被动方没有剩余数据,第二步与第三步报文可以合并,四次挥手简化为三次挥手。

  1. 可靠性保障机制

  2. 序号与确认序号:每个字节数据都有序号;接收方回复确认序号,告诉发送方下一次期望接收的字节位置,以此保证数据完整、有序。

  3. 滑动窗口:做流量控制。通过TCP头部窗口大小字段,通知对方本机接收缓冲区剩余容量,控制发送速率,避免接收方处理不过来。

  4. 拥塞控制:针对网络链路拥堵,动态调整发送速度,防止大量报文冲垮网络。

  5. 保活探测:连接建立完成到挥手结束前,定期探测,检测对方是否掉线,处理断连异常。

  6. TCP与UDP对比

  • UDP:无连接,实现简单,资源开销小;不做重传、不保证顺序,传输不可靠。适合直播、语音这类允许少量丢包的场景。
  • TCP:面向连接,逻辑复杂,资源开销更大;有重传、序号、窗口机制,数据安全可靠。文件传输、HTTP都基于TCP。

二、HTTP协议

HTTP是跑在TCP之上的应用层协议,规定文本数据在网络当中传输格式。分为C/S客户端服务器、B/S浏览器服务器两种架构。

  1. C/S模型(客户端/服务器)

客户端是独立程序。

  • 优点:资源存本地,加载速度快,离线部分功能可用。
  • 缺点:占用本地存储空间;不同系统要单独开发客户端;更新功能需要安装升级包。
  1. B/S模型(浏览器/服务器)

不需要专用客户端,直接使用浏览器访问。

  • 优点:资源全部放在服务器;更新资源只改服务端,客户端无需升级;一套代码多平台通用。
  • 缺点:每次查看资源都要从服务器下载,依赖网络。
  1. URL统一资源定位符

格式: 协议://主机:端口/路径

  1. 协议:http、https,规定通信规则。

  2. 主机:服务器域名/IP,DNS会把域名翻译成IP地址。

  3. 端口:服务程序端口。HTTP默认80,HTTPS默认443。

  4. 路径:服务器上资源存放位置。

  5. HTTP完整通信流程

  6. 用户输入URL

  7. DNS解析域名,客户端向服务器IP+端口发起TCP三次握手,建立TCP连接

  8. 客户端发送HTTP请求报文

  9. 服务器处理,返回HTTP响应报文

  10. 完成交互,TCP四次挥手断开连接

  11. HTTP请求报文

整体分为三部分:请求行、首部行、实体主体,使用 CRLF (回车换行)作为行分隔符,空行区分头部和正文。

  1. 请求行:方法 + URL + HTTP版本
  • GET:获取服务器资源,参数放在URL上。
  • POST/PUT:向服务器提交数据,数据放在实体主体。
  1. 首部行:键值对,传递附加信息,例如Host、Connection。

  2. 实体主体:POST等方法携带数据,GET一般为空。

  3. HTTP响应报文

  4. 状态行:版本 + 状态码 + 描述短语

  • 1xx:通知信息,请求正在处理
  • 2xx:成功,请求正常完成
  • 3xx:重定向,需要进一步操作
  • 4xx:客户端错误,请求格式、参数错误
  • 5xx:服务端错误,服务器内部故障
  1. 首部行:键值对,返回服务器信息、数据长度、编码格式。
  2. 实体主体:返回的数据,我们获取的JSON、网页内容都在这里。

重点总结

  1. TCP三次握手建立连接,四次挥手断开;序号、滑动窗口、拥塞控制共同实现可靠传输。
  2. TCP面向连接可靠;UDP无连接不可靠。
  3. HTTP基于TCP,B/S架构不需要专用客户端;URL四要素:协议、主机、端口、路径。
  4. 请求报文:请求行+首部+实体;响应报文:状态行+首部+实体;状态码记住2xx成功、4xx客户端错、5xx服务端错。
  5. C语言HTTP客户端作业核心考点:socket通信、剥离HTTP头部、cJSON解析普通对象、遍历JSON数组。
  6. chunked分块响应不能用简单recv完整读取,简易demo只能做妥协处理,正式项目需要完整实现分块解析。
相关推荐
未济1 天前
linux 配置环境变量
linux
傲世仙尊1 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
虎头金猫1 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
_艾伦 耶格尔.1 天前
进程间通信
linux
Liuqy-051 天前
Linux IO编程——静态库、动态库
linux
wuyk5551 天前
《WiFi 嵌入式物联网开发全套实战》| 第 16 章 ESP32 AP+STA 双模共存原理与工程坑点
网络·stm32·物联网
彧azz1 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
-梅2 天前
linux(8) 软硬链接
linux·运维·服务器
AIgorithmGEEK2 天前
[Linux]线程三部曲(上):一个执行流的诞生——从操作系统一路拆到 pthread_create
linux·线程·pid
琥珀色糖2 天前
SimlpeHttp
linux·服务器