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只能做妥协处理,正式项目需要完整实现分块解析。
相关推荐
Linux界最忧郁之人11 小时前
华为云ECS&IMS&AS实战|弹性云服务器、私有镜像、弹性伸缩完整实验
linux·运维·服务器·centos·华为云·openstack
whyutianict_vv12 小时前
零基础转 AI 运维:投入清单、技术路线与核对表
linux·运维·人工智能·ai
无言听风雨丶12 小时前
systemd 与信号 / 僵尸进程:Linux 进程管理的底层逻辑与排错
linux·服务器·网络
DevOpenClub12 小时前
高考一分一段 API:分数查位次、科类枚举与历史对照
linux·数据库·高考
小贾要学习12 小时前
【C++后端开发项目】Reactor 模型 / C++ 仿写 muduo HTTP 服务器:让底层网络库真正跑起网页
linux·服务器·c++·http·网络编程·muduo·reactor模型
g5zhu589612 小时前
没有公网ip的情况下,本地能ping服务器服务器不能ping本地,让服务器能访问本地某端口的简单方法
服务器·网络协议·tcp/ip
Blockbuater_drug12 小时前
OpenMM分子动力学模拟02 安装:Linux:conda 一条命令装通 GPU 加速的分子模拟环境
linux·conda·cuda·gpu驱动·pythonpath·openmm安装
SDWAN_Cheap12 小时前
BGP是什么,广播IP是什么?两个容易混淆的概念拆解
网络·tcp/ip·bgp·广播ip
程序员JerrySUN12 小时前
PCIe Gen5 SSD 为什么读得快、写得慢?从存储原理到 Linux 性能实测
linux·服务器·网络
Android系统攻城狮13 小时前
Linux FFmpeg深度解析之avcodec_parameters_copy调用流程与实战(二十五)
linux·运维·服务器·ffmpeg·音视频·车载音频