【网络】TCP与HTTP:网络通信的核心机制解析

【网络】TCP与HTTP:网络通信的核心机制解析 TCPTCP 本身也是一个“协议”而且是一个非常“厚”的传输层协议。1.TCP 在网络模型中的位置在 TCP/IP 模型里TCP 是传输层协议在 IP 之上、应用层之下应用层HTTP、FTP、SSH、DNS 等你要用的业务传输层TCP、UDP负责端到端传输网际层IP负责主机到主机的尽力而为转发网络接口层以太网、Wi-Fi 等负责真正物理传输所以从“封装关系”看HTTP应用层协议定义“请求/响应长什么样”。TCP传输层协议定义“如何在一个不可靠的 IP 网络上可靠地传输字节流”。IP网络层协议定义“如何把数据包从一端主机传到另一端主机”。2.TCP 的核心特性一句话版TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。可以拆成几个关键词面向连接通信前要先“三次握手”建立连接结束后“四次挥手”断开连接。可靠传输保证数据无差错、不丢失、不重复、按序送达。面向字节流把数据看成一连串字节不保留“消息边界”。全双工连接建立后双方可以同时收发数据。流量控制和拥塞控制防止发太快淹没接收方或堵死网络。3.用一个比喻理解 TCP如果用“寄快递”比喻IP快递公司只负责把包裹从城市 A 运到城市 B不保证不丢、不保证不烂、不保证一次到。TCP一个负责调度客服的系统发货前先和对方确认“你要不要收快递能收多少”连接建立。发货时给每个包裹编号记录发了几号、对方确认了几号没确认就重发。对方仓库满了通知你“先别发那么快”流量控制。路上堵车自动减慢发货速度拥塞控制。HTTP你们公司内部填的“发货单格式”怎么写订单号、品名、数量等。4.TCP 主要机制一图看懂下面这张流程图把 TCP 的核心机制串在一起5.重点机制拆开讲一下5.1 面向连接三次握手 / 四次挥手三次握手建立连接客户端 - 服务器SYN1, seqx请求建立连接服务器 - 客户端SYN1, ACK1, seqy, ackx1同意并同步自己的序列号客户端 - 服务器ACK1, seqx1, acky1确认目的同步双方的初始序列号ISN确认双方的发送、接收能力正常。四次挥手断开连接A - BFIN1, sequ我没有数据要发了B - AACK1, acku1我知道了B - AFIN1, seqv我也没有数据要发了A - BACK1, ackv1我知道了因为是全双工每个方向需要单独关闭所以是四次。5.2 可靠传输序号确认重传序列号Sequence NumberTCP 给数据流中的每个字节编号接收方根据序号排序、去重。确认号Acknowledgment Number告诉对方“我期望下一个收到的字节序号是多少”表示之前的字节都受到了。超时重传发送数据后启动定时器若在重传时间RTO内没收到 ACK就重传该段。快速重传收到 3 个重复的 ACK 时立即重传对应的段而不必等超时。5.3 流量控制滑动窗口接收方在 ACK 中携带“窗口大小”告诉对方我当前还能接收多少字节。发送方根据这个窗口控制发送速率避免接收方缓冲区溢出。简单理解接收方说“我只能再收 10KB 了”发送方就只发 10KB等新的窗口通知。5.4 拥塞控制防止网络被“打爆”TCP 有一套拥塞控制算法慢启动、拥塞避免、快速重传、快速恢复等。核心思路一开始先慢慢发慢启动逐步增加发送窗口一旦检测到丢包认为网络拥塞就大幅减小窗口然后再线性增加拥塞避免避免再次拥塞。目标是在保证可靠性的前提下尽量提高网络利用率但又不能把网络压垮。6.TCP 和 UDP 的对比顺带提一下特性TCPUDP连接面向连接三次握手/四次挥手无连接可靠性可靠确认、重传、序号、校验不可靠尽最大努力交付顺序保证按序到达不保证顺序流量/拥塞控制有滑动窗口、拥塞控制没有传输方式字节流无消息边界数据报保留消息边界典型应用HTTP、SSH、FTP、邮件DNS、直播、视频会议、游戏7.和 HTTP 的关系HTTP定义“请求行 头部 body 的格式”以及状态码、方法等语义。TCP保证这一串 HTTP 报文能够可靠地从客户端传到服务器不丢、不乱、不重复。IP把 TCP 段打成 IP 包在网络上一跳一跳传过去。所以可以这样理解HTTP 是“上层业务协议”TCP 是“下层可靠传输管道”IP 是“负责真正投递的快递公司”。HTTPHTTP 是应用层协议通常运行在 TCP传输层之上利用 TCP 提供的可靠字节流传输来收发 HTTP 报文。1.层次上看HTTP在上TCP在下在 TCP/IP 模型里应用层HTTP、FTP、SMTP 等传输层TCP、UDP互联网层IP网络接入层以太网、Wi-Fi 等所以 HTTP 是“上层”TCP 是“下层”HTTP 把 TCP 当成“可靠的传输管道”来用。可以简单理解为2.封装关系HTTP报文→ TCP段→IP包当浏览器发一个 HTTP 请求时大致是这样“封装”的浏览器构造 HTTP 请求例如GET / HTTP/1.1首部等。HTTP 报文交给传输层使用 TCPTCP 加上自己的首部源端口、目的端口、序号、确认号等形成 TCP 段。TCP 段交给网络层 IPIP 再加首部源 IP、目的 IP 等形成 IP 包。IP 包再交给数据链路层和物理层真正在网上传输。所以从“数据封装”的角度看HTTP 是“内容”定义请求/响应的格式、方法、状态码、首部语义等TCP是“快递公司”负责把这段数据可靠地送到对方手里不丢、不乱序、差错检测等。3.能不能说“HTTP 是 TCP 的封装”可以理解为HTTP 使用 TCP 提供的服务HTTP 报文作为 TCP 的“数据部分”被 TCP 段封装。但严谨一点说HTTP 和 TCP 是两个不同层上的协议不是“HTTP 是 TCP 的某个扩展”。HTTP 定义的是“应用层语义”怎么表示请求、响应、资源等TCP 定义的是“传输层语义”怎么建立连接、可靠传输、流量控制、拥塞控制等。4.一个细节HTTP/3 不再直接跑在TCP上有一个重要例外HTTP/1.0、HTTP/1.1、HTTP/2都是跑在 TCP 之上。HTTP/3跑在 QUIC 之上而 QUIC 是跑在 UDP 之上的传输层协议。所以更精确的说法是HTTP 是应用层协议传统上运行在 TCP 之上但 HTTP/3 改为运行在 QUIC基于 UDP之上。也就是说HTTP 语义不变只是底层“运输方式”从 TCP 换成了 QUIC。5.总结一句HTTP 确实是“在 TCP 之上封装”出来的协议用 TCP 做可靠传输。不过从网络分层看更严谨的说法是HTTP 是应用层协议TCP 是传输层协议HTTP 利用 TCP 提供的可靠字节流服务来实现请求/响应模型而 HTTP/3 则把这个“传输层”换成了 QUIC。