一、TCP传输核心机制
TCP是面向连接的可靠传输协议,通信建立、数据传输、连接断开都有固定流程。
- 三次握手
通信开始前通过三次握手建立可靠连接。
- 发送端发送SYN报文,请求建立连接
- 接收端回复ACK+SYN,确认收到请求,同时向对方发起连接请求
- 发送端回复ACK,连接正式建立
握手完成之后双方才可以收发业务数据。
- 四次挥手
完成数据传输之后,使用四次挥手断开连接。
- 主动关闭方发送FIN,表示本方不再发送数据
- 被动关闭方回复ACK,确认收到关闭请求,此时被动方还可以继续把剩余数据发完
- 被动关闭方数据发送完毕,发送FIN
- 主动关闭方回复ACK,连接彻底释放
补充:如果被动方没有剩余数据,第二步与第三步报文可以合并,四次挥手简化为三次挥手。
-
可靠性保障机制
-
序号与确认序号:每个字节数据都有序号;接收方回复确认序号,告诉发送方下一次期望接收的字节位置,以此保证数据完整、有序。
-
滑动窗口:做流量控制。通过TCP头部窗口大小字段,通知对方本机接收缓冲区剩余容量,控制发送速率,避免接收方处理不过来。
-
拥塞控制:针对网络链路拥堵,动态调整发送速度,防止大量报文冲垮网络。
-
保活探测:连接建立完成到挥手结束前,定期探测,检测对方是否掉线,处理断连异常。
-
TCP与UDP对比
- UDP:无连接,实现简单,资源开销小;不做重传、不保证顺序,传输不可靠。适合直播、语音这类允许少量丢包的场景。
- TCP:面向连接,逻辑复杂,资源开销更大;有重传、序号、窗口机制,数据安全可靠。文件传输、HTTP都基于TCP。
二、HTTP协议
HTTP是跑在TCP之上的应用层协议,规定文本数据在网络当中传输格式。分为C/S客户端服务器、B/S浏览器服务器两种架构。
- C/S模型(客户端/服务器)
客户端是独立程序。
- 优点:资源存本地,加载速度快,离线部分功能可用。
- 缺点:占用本地存储空间;不同系统要单独开发客户端;更新功能需要安装升级包。
- B/S模型(浏览器/服务器)
不需要专用客户端,直接使用浏览器访问。
- 优点:资源全部放在服务器;更新资源只改服务端,客户端无需升级;一套代码多平台通用。
- 缺点:每次查看资源都要从服务器下载,依赖网络。
- URL统一资源定位符
格式: 协议://主机:端口/路径
-
协议:http、https,规定通信规则。
-
主机:服务器域名/IP,DNS会把域名翻译成IP地址。
-
端口:服务程序端口。HTTP默认80,HTTPS默认443。
-
路径:服务器上资源存放位置。
-
HTTP完整通信流程
-
用户输入URL
-
DNS解析域名,客户端向服务器IP+端口发起TCP三次握手,建立TCP连接
-
客户端发送HTTP请求报文
-
服务器处理,返回HTTP响应报文
-
完成交互,TCP四次挥手断开连接
-
HTTP请求报文
整体分为三部分:请求行、首部行、实体主体,使用 CRLF (回车换行)作为行分隔符,空行区分头部和正文。
- 请求行:方法 + URL + HTTP版本
- GET:获取服务器资源,参数放在URL上。
- POST/PUT:向服务器提交数据,数据放在实体主体。
-
首部行:键值对,传递附加信息,例如Host、Connection。
-
实体主体:POST等方法携带数据,GET一般为空。
-
HTTP响应报文
-
状态行:版本 + 状态码 + 描述短语
- 1xx:通知信息,请求正在处理
- 2xx:成功,请求正常完成
- 3xx:重定向,需要进一步操作
- 4xx:客户端错误,请求格式、参数错误
- 5xx:服务端错误,服务器内部故障
- 首部行:键值对,返回服务器信息、数据长度、编码格式。
- 实体主体:返回的数据,我们获取的JSON、网页内容都在这里。
重点总结
- TCP三次握手建立连接,四次挥手断开;序号、滑动窗口、拥塞控制共同实现可靠传输。
- TCP面向连接可靠;UDP无连接不可靠。
- HTTP基于TCP,B/S架构不需要专用客户端;URL四要素:协议、主机、端口、路径。
- 请求报文:请求行+首部+实体;响应报文:状态行+首部+实体;状态码记住2xx成功、4xx客户端错、5xx服务端错。
- C语言HTTP客户端作业核心考点:socket通信、剥离HTTP头部、cJSON解析普通对象、遍历JSON数组。
- chunked分块响应不能用简单recv完整读取,简易demo只能做妥协处理,正式项目需要完整实现分块解析。