传输层的核心使命:端到端通信的守护者
引言 在前面的文章中,我们理解了网络层(IP协议)如何实现主机到主机的通信。但这里有个问题: 一台主机上运行着几十个应用程序(浏览器、微信、游戏、音乐播放器…),当数据包到达这台主机时,网络层该把它交给哪个应用? 这就是传输层要解决的核心问题:端到端通信(进程到进程通信)。 今天我们来理解: ✅ 传输层为什么必须存在? ✅ 端口号如何解决"进程寻址"问题? ✅ Socket是什么?为什么它是网络编程的核心? ✅ TCP和UDP的本质区别是什么? 第一性原理:为什么需要传输层? 问题1:网络层只能送到主机,不能送到进程 想象一个场景: 你的电脑(IP: 192.168.1.100)同时在: - 浏览器访问淘宝(Chrome进程) - 微信聊天(WeChat进程) - 后台下载文件(迅雷进程) - 听音乐(网易云进程) 当一个数据包到达 192.168.1.100 时,网络层只知道这是给这台主机的,但不知道该交给哪个应用程序。 传输层的第一个使命:在网络层"主机到主机"的基础上,实现"进程到进程"的通信。 问题2:不同应用对通信质量有不同要求 HTTP下载文件:要求数据完整,可以慢一点 视频通话:要求实时性,丢几个数据包问题不大 游戏:要求低延迟,偶尔丢包可以接受 文件传输:要求100%可靠,不能有任何错误 传输层的第二个使命:根据应用的不同需求,提供不同的传输服务(可靠的TCP vs 快速的UDP)。 问题3:网络是不可靠的 网络层(IP协议)只负责"尽力而为"地传输数据包,它不保证: ❌ 数据包一定能到达 ❌ 数据包按序到达 ❌ 数据包不重复 ❌ 数据包不损坏 对于需要可靠通信的应用,必须有一层协议来保证这些特性。 传输层的第三个使命:为需要可靠通信的应用提供可靠传输服务(TCP的职责)。 端口号:进程的"身份证" 端口号的设计哲学 核心思想:用一个16位整数(0-65535)唯一标识一台主机上的一个应用程序(准确说是一个进程的通信端点)。 IP地址 → 定位主机(哪台电脑) 端口号 → 定位进程(哪个应用) 完整的通信地址(五元组): 源IP + 源端口 + 目标IP + 目标端口 + 协议类型(TCP/UDP) 端口号的分类 端口范围 名称 用途 示例 0-1023 知名端口(Well-Known Ports) 系统服务和常见应用 HTTP:80, HTTPS:443, SSH:22, MySQL:3306 1024-49151 注册端口(Registered Ports) 用户应用程序 Tomcat:8080, Redis:6379, Nacos:8848 49152-65535 动态端口(Dynamic Ports) 客户端临时使用 客户端发起连接时随机分配 实战案例:查看端口使用情况 场景1:查看当前监听的端口 ...