这周课程的标题是《传输层(上)》,正好讲到网络协议栈里最核心的一层。说实话,传输层是很多网络问题的分水岭,理解了它,你再看什么连接超时、端口占用、视频卡顿,思路会完全不同。这篇博客把这周涉及的内容整理了一遍,包括端口寻址、UDP、TCP报文结构、三次握手和四次挥手,也补了一些我实际排查问题时踩过的坑。
1. 为什么网络层已经把数据送到门口,传输层还要再插一脚
学习网络的时候,很多人会有一个先入为主的疑问:IP地址都已经让数据包可以从一台主机跑到另一台主机了,那传输层是不是多余?我一开始也有这个困惑,直到自己抓包的时候发现了一个非常朴素的事实:数据包到达一台服务器之后,内核需要知道把这个负载交给哪个进程。同理,你本机的浏览器、邮件客户端、即时通讯软件同时在收发数据,操作系统收到数据之后,怎么区分这是给浏览器的还是给QQ的?这个区分工作,恰恰是网络层做不了的。
网络层的核心设备是IP地址,它解决的是一个“跨网络寻址”的问题,也就是让数据包可以横穿整个互联网,最终找到目标主机。但主机内部通常不是一台只跑一个应用的专用机器,而是一台同时跑着几十上百个进程的通用系统。如果你只有IP地址,数据包到了网卡之后就只能“待分配”,内核完全不知道该把它扔给哪个进程。
传输层在这里承担的是“最后一公里内的精确分拣”角色。它引入了端口(Port)和协议类型两个维度,把一个运输问题从“主机到主机”细化成了“进程到进程”。端口号是一个16位的整数,范围0到65535,它标识的就是主机上一个具体的通信入口,可以理解成大楼楼层已经找到了,但快递员还需要按门铃找到具体是哪个房间。
还有一层经常被忽略的作用是复用与分用。发送端可以多个应用程序同时使用不同的端口对外通信,这叫复用,接收端把收到的数据根据目的端口分发给不同进程,这叫分用。如果没有传输层,那你只能一次跑一个网络应用,体验完全不可接受。所以传输层不是给网络层“锦上添花”,它是网络体系结构里必不可少的那一棒接力。
这周的课正好把传输层拆成了两部分来讲,上半部分重点是概念与协议基础,包括端口、套接字、UDP和TCP报文结构。下半部分预期会进入可靠性、流量控制这类更深的机制。我理解这么拆分是有道理的:如果一上来就把TCP的重传机制、滑动窗口、拥塞控制塞进来,很容易被细节淹没。先搞清楚传输层的定位和协议长什么样,再来理解算法行为,才是顺的路径。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 端口和套接字:先搞懂进程与进程之间的寻址是怎么回事
2.1 端口号不是设备上的物理接口
端口号这个名字容易让人误解,我最早以为它对应的是路由器上的物理插口,后来才知道它完全是一个逻辑概念,硬要说的话它更像是“进程在网络上的门牌号”。操作系统会给每一个需要网络通信的进程分配或由进程主动绑定一个端口,这个端口和IP地址组合起来,就能唯一定位到互联网上的一个进程。
习惯上端口号分成了三段:0到1023是系统端口,也叫知名端口,HTTP服务用80,HTTPS用443,DNS用53,SSH用22,像这类约定俗成的服务都固定在这段区间。1024到49151是注册端口,应用可以申请使用,但部分需要特权或约定,比如MySQL的3306。49152到65535是动态端口,客户端程序发起对外连接时,操作系统通常会从这个区间自动挑一个空闲的端口作为临时源端口。
我在自己的机器上验证过这个行为。用浏览器打开几个网站之后,在终端执行:
bash复制netstat -an | gr
