传输层的特点
TCP:保证数据的可靠和顺序交付
端口号
TCP 和 UDP 分别拥有自己的端口号,两者互不干扰。也就是说,TCP 进程和 UDP 的进程可以使用同一个端口号。可以从两个角度来帮助理解:
- IP 协议会先根据协议类型,将数据交给 TCP 或者 UDP,再由 TCP/UDP 根据端口号交给不同的进程。
- 系统在绑定套接字时,需要提供三个参数:IP,协议,端口。
为什么用端口号标识应用程序,而不是 pid?
不同的计算机系统使用的进程编号是不同的,端口号就是对应用程序编号的抽象。(计算机领域,抽象出一个中间层,问题就简化了很多)
服务器端口号
- 0~1023 是服务器使用的熟知端口号
- 1024 ~ 49151 是服务器使用的登记端口号,使用这些端口号的应用程序需要向组织登记
客户端端口号
- 49152 ~65535 是供客户端使用的端口号
TCP 和 UDP 的对比
TCP | UDP | |
---|---|---|
面向的对象 | 字节流 为每个字节都设置了编号 |
数据报 传输层不进行拆分和合并操作 |
通信对象 | 只支持 1 对 1,全双工的 | (1,多) 对(1,多) |
是否有连接 | 有连接的 需要维护连接相关的数据结构(缓存,连接对象等,窗口) |
无连接 |
分组首部 | 20B | 8B |
流量控制 | 给予滑动窗口实现流量控制 | 没有 |
拥塞控制 | 设置有拥塞窗口 | 没有 |
适用场景 | 对可靠性要求高的程序: 远程登陆 |
对实时性要求高的程序: 能够容忍数据丢失,不能容忍大的时延,比如电话和会议 |
差错校验 | 有 | 可选的,对首部以及数据部分进行 |
可靠性 | 重传:超时重传;以及 3 冗余 ACK 重传 序号与确认机制 |
没有重传和确认 |