小码哥《网络协议从入门到底层原理》笔记(七):传输层、UDP、TCP可靠传输
我的Github地址
小码哥《恋上数据结构与算法》笔记
极客时间《iOS开发高手课》笔记
iOS大厂面试高频算法题总结
iOS面试资料汇总
传输层(Transport)
- 传输层有2个协议
TCP(Transmission Control Protocol),传输控制协议。
UDP(User Datagram Protocol),用户数据报协议。

UDP
数据格式
UDP是无连接的,减少了建立和释放连接的开销。
UDP尽最大能力交付,不保证可靠交付。
- 因此不需要维护一些复杂的参数,首部只有
8个字节(TCP的首部至少20个字节)。

UDP长度(Length)
检验和
- 检验和的计算内容:
伪首部 + 首部 + 数据
- 伪首部:仅在计算检验和时起作用,并不会传递给网络层。

端口
- UDP首部中端口是占用
2字节。
- 客户端的源端口是临时开启的随机端口。
- 防火墙可以设置开启/关闭某些端口来提高安全性。
- 常用命令行
netstat -an:查看被占用的端口
netstat -anb:查看被占用的端口, 占用端口的应用程序
telnet 主机 端口:查看是否可以访问主机的某个端口

TCP

数据格式
- 数据偏移
- 占4位,取值范围是
0x0101~0x1111
- 乘以4:首部长度(Header Length)
- 首部长度是
20~60bytes
- 保留
一个细节
- 为什么
TCP和UDP首部记录数据长度的位数不一样?
- UDP的首部中有个
16位的字段记录了整个UDP报文段的长度(首部 + 数据)
- 但是,
TCP的首部中仅仅有个4位的字段记录了TCP报文段的首部长度, 并没有字段记录TCP报文段的数据长度
- 分析
UDP首部中占16位长度字段是冗余的,纯粹是为了保证首部是32bit对齐
TCP/UDP的数据长度,完全可以由IP数据包的首部推测出来
传输层的数据长度 = 网络层的总长度 - 网络层的首部长度 - 传输层的首部长度
检验和

- 跟UDP一样,TCP检验和的计算内容:伪首部 + 首部 + 数据
- 伪首部:占用12字节,仅在计算检验和时起作用,并不会传递给网络层
标志位
- URG(urgent)
- 当
URG = 1时, 紧急指针字段才有效, 表明当前报文段中有紧急数据, 应优先尽快传送
- ACK(Acknowledgment)
- PSH(Push)
- RST(Reset)
- 当
RST = 1时, 表明连接中出现严重差错, 必须释放连接, 然后再重新建立连接
- SYN(Synchronization)
- 当
SYN = 1, ACK = 0时, 表明这是一个建立连接的请求
- 若对方同意建立连接, 则回复
SYN = 1, ACK = 1
- FIN(Finish)
- 当
FIN = 1, 表明数据已经发送完毕, 要求释放连接
序号、确认号、窗口
- 序号(Sequence Number)
- 占
4字节
- 首先,在传输过程的每一个字节都会有一个编号
- 在建立连接后,序号表示:这一次传给对方的
TCP数据部分的第一个字节的编号
- 确认号(Acknowledgement Number)
- 占
4字节
- 在建立连接后,确认号代表:期望对方下一次穿过来的
TCP数据部分的第一个字节的编号
- 窗口(Window)
- 占
2字节
- 这个字段有流量控制功能,用以告知对方下一次允许发送的数据大小(字节为单位)