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数据的解析
相关推荐
一隅论数智2 天前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
XiHongShi20162 天前
STM32F407 RTC定时器例程,建议保存
stm32·单片机·学习
爱吃苹果的日记本2 天前
离散数学第六课
学习·离散数学
AI职业加油站2 天前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
旖旎夜光2 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
奇思妙想聪明勤奋的小羊2 天前
DeepAgents第5章:子Agent 与上下文隔离—让 Agent学会委派
人工智能·python·学习·语言模型
霍霍的袁2 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
彧azz2 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
我爱cope2 天前
【操作系统 | 计算机硬件:CPU、内存与 I/O 如何支撑操作系统?】
学习·操作系统