TCP通信与HTTP协议学习笔记:粘包、三次握手、四次挥手与C/S、B/S模型

1. 粘包问题与解决方案

TCP 发送多包数据时,数据会发生粘连,一起发送给接收端。解决粘包问题的方法包括:

  • 加延时
  • 设置数据边界(文件名\r\n)
  • 定长发送

2. TCP通信:20字节固定头

TCP 通信使用 20 字节固定头,其中各标志位含义如下:

  • 当 ACK 置 1 时,32 位确认序号才能正常使用
  • FIN:结束通信
  • SYN:请求应答
  • RST:重新建立连接
  • PSH:发送数据
  • ACK:确认应答
  • URG:数据加急

3. 三次握手

通信之前使用三次握手建立连接:

  1. 发送端:SYN
  2. 接收方:ACK + SYN
  3. 发送端:ACK

4. 四次挥手

为保证通信完整,使用四次挥手结束连接:

  1. 主动关闭一端:FIN
  2. 被动关闭一端:ACK(该端是否数据发送完毕,如果发送完毕会发送ACK+FIN)
  3. 被动关闭一端:FIN
  4. 主动关闭一端:ACK

如果双方通信结束(不传输数据),此时四次挥手也可能变成三次挥手。TCP 在四次挥手之前,默认保持 TCP 通信连接的状态。

5. 发送过程中保证数据传输

TCP 通过序号和确认号保证数据传输的完整性:

  • 序号:该包数据起始字节的编号(本次发送的序号一般为上次接收到的确认号)
  • 确认序号:接收方希望发送方下次发送数据首字节的序号(本次发送的确认序号一般为上次接收到的序号 + 实际接收的长度)

6. 滑动窗口机制

滑动窗口机制保证传输过程中对流量进行控制。通过调节 TCP 包头中的窗口大小来设置发送窗口和接收窗口大小,完成对流量及发送速率的控制。

7. 拥塞控制机制

如果网络拥堵,带宽占用较大,TCP 自带拥塞控制机制来实现数据可靠通信。

8. 掉线检测机制

TCP 三次握手建立后,四次挥手结束前,整个过程通信双方保持连接,可以通过掉线检测机制检测 TCP 连接是否保持。

9. TCP和UDP的区别

UDP特点:

  • UDP实现机制简单
  • UDP资源开销小
  • UDP不安全不可靠
  • UDP是无连接的

TCP特点:

  • TCP实现机制复杂
  • TCP资源开销大
  • TCP安全可靠
  • TCP是有连接的

11. HTTP协议

HTTP(HyperText Transfer Protocol,超文本传输协议)是基于 TCP 的一种应用层协议,用于规定超文本在网络中传输的流程。HTTP 采用请求/响应模型,客户端发起请求,服务器返回响应。

11.1 HTTP的特点

  • 应用层协议:HTTP 建立在 TCP 之上,由 TCP 保证数据传输的可靠性
  • 请求/响应模型:客户端发送请求,服务器返回响应
  • 无状态:HTTP 本身不保存客户端的状态信息,每次请求相互独立
  • 灵活:支持传输任意类型的数据对象,通过 Content-Type 标识数据类型

11.2 C/S模型:客户端/服务器模型

优点:

  • 资源在本地,加载速度快
  • 无需连接服务器,本地也能工作

缺点:

  • 占据本地空间
  • 不同的平台,客户端需要单独编写一份代码
  • 资源增加时,需要本地升级版本,或打补丁

11.3 B/S模型:浏览器/服务器模型

特点:

  • 资源在服务器上
  • 新增资源时,无需更新本地的内容
  • 每次查看资源,都是从服务器上下载最新资源到本地来查看
  • 任何平台都有浏览器,代码可以通用,避免重复开发客户端

11.4 URL:统一资源定位符

URL(Uniform Resource Locator)用于唯一标识互联网上的资源,其基本格式为:协议://主机:端口/路径。各部分含义如下:

  • 协议:通过协议从服务器获取该资源,常见为 http 或 https
  • 主机:服务器的 IP 地址,通常以域名形式展示,通过 DNS 服务器,将域名转换为其对应的 IP 地址
  • 端口:服务器上的应用程序端口号,HTTP 常见端口为 80 或 8080,HTTPS 端口 443
  • 路径:资源在服务器中存放的位置

11.5 HTTP传输的过程

  1. 在浏览器中输入URL
  2. 浏览器向URL中对应的IP地址和端口发送TCP连接
  3. 发送HTTP请求报文
  4. 回复HTTP响应报文
  5. 断开TCP连接

11.6 HTTP请求报文格式

请求报文由请求行、首部行和实体主体三部分组成。

请求行:方法 + URL + 版本

  • GET方法:获取服务器资源
  • POST方法:向服务器提交资源(如表单数据)
  • PUT方法:向服务器上传资源,用于更新或替换
  • DELETE方法:删除服务器上的指定资源
  • URL:请求获取/提交资源的路径
  • 版本:HTTP/1.1

首部行:根据不同的场景使用不同的首部字段,格式为:首部字段: 值。常见首部字段包括:

  • Host:请求的主机名和端口号
  • Content-Type:请求体的数据类型(如 application/json)
  • Content-Length:请求体的长度
  • User-Agent:客户端类型和版本信息
  • Cookie:携带的会话标识信息

11.7 HTTP响应报文格式

响应报文由状态行、首部行和实体主体三部分组成。

状态行:版本号 + 状态码 + 状态码描述

  • 版本号:HTTP/1.1
  • 状态码:响应该次请求的结果

常见状态码分类:

  • 1xx:信息提示,表示请求已接收,继续处理
  • 2xx:成功,请求已成功处理。如 200 OK 表示请求成功
  • 3xx:重定向,需要进一步操作完成请求。如 302 Found 表示资源临时移动
  • 4xx:客户端错误,请求有误。如 404 Not Found 表示资源不存在
  • 5xx:服务器错误,服务器无法完成请求。如 500 Internal Server Error 表示服务器内部错误

12. 练习:获取实时天气信息

从nowapi网站获取用户配置城市的实时天气信息及未来一周的天气信息,并将其显示在终端屏幕上。

  1. 使用自己的账号对应的APPKey和Sign标识(必须提前开通天气预报功能)
  2. 不要使用教室wifi访问nowapi网站,使用手机热点访问,电脑连入手机热点(连入手机热点后,Ubuntu需要重启才能获得手机热点提供的IP地址,需要注意有的手机只允许1个设备连入,咱们现在电脑连入需要2个IP地址,所以需要主机手机可能要修改允许多个设备连入)
  3. 消化示例代码
  4. 通过AI或者CSDN学习JSON数据格式,并利用提供的cJSON.c和cJSON.h实现对JSON数据的解析
相关推荐
ZhiMuZhiLing13 分钟前
拓客软件学习成本实测方法论:从注册到出第一批名单要多久
学习·流量运营·用户运营
一直C20 分钟前
Linux网络编程|HTTP协议详解(报文、请求方法、状态码)
linux·http·wireshark·vim·visual studio
程序员大雄学编程1 小时前
微积分46. 无穷级数四大核心性质:从理论到实践的全方位解析
python·学习·微积分·学习工具
指针常量3 小时前
【RL系列文章】难样本学习等
学习·大语言模型·rl·后训练
白狐_7983 小时前
408 计算机网络|TCP 可靠传输:ACK、重传、RTT、RTO
网络·tcp/ip·计算机网络
wuyk5553 小时前
从零吃透Modbus通信|第7章:终极工程整合(模块化架构、双模式主机从机、RTOS适配、量产级模板)
c语言·stm32·学习·架构
一条破秋裤4 小时前
STM32 学习笔记:PWM 驱动 LED 呼吸灯与舵机代码
笔记·stm32·学习
严谨的麻辣烫5 小时前
2026 年静态 IP 为什么重新受到关注?从住宅代理安全问题看固定网络出口
运维·服务器·tcp/ip·网络安全
Neighbor_OldY5 小时前
云上VPC流日志与网络流量安全分析实战:异常流量、横向移动、C2外连与恶意IP的发现与处置
网络协议·tcp/ip·安全