网络互联
想一想如果你要下载文件,是不是希望文件下的越稳越好,因为你不想一次又一次地点击重新下载按钮?但如果你要直播,带来的数据量是巨大 的,且不谈你需要在短短的一段时间内传输完成。这个时候,我们就有了不同传输协议的需要。
TCP适合应对前者,UDP适合后者。
TCP是面向连接的一种可靠的传输控制协议,它拥有流控以及窗口机制,用独特的三次握手四次挥手的机制为它赢来了稳定性。但是缺点也很明显,它不能太
UDP是一种不可靠无连接的用户数据报协议。诚然它只能尽力传,不稳定,会丢包,但是传输量大,可靠性要求度不高又大的音视频应用场合就可以用它。
TCP和UCP都应用在传输层,也就是OSI第4层。同样也是在TCP/IP模型的传输层。
TCP和UDP报文格式
TCP报文格式
TCP 的序号字段为 32 位,可表示 到 的序号,每个序号对应一个字节,因此序号空间大小为 字节,即 4GB。但序号是循环使用的,所以实际可以传输超过 4GB 的数据,只是需要处理序号回绕问题。
这个窗口是用来做流量控制的。
偏移值和IP报头(IHL)本质一样,描述的是报头的长度,它的取值理论上是可以0~15,但是实际上只取5~15,所以这就是为什么TCP的报头是可扩展的。
报头最小20字节,最长60字节。为什么?
TCP报文头允许携带选项(Options),例如最大报文段长度(MSS)、窗口缩放因子、时间戳等。这些选项的长度是可变的,但必须是4字节的整数倍(如果需要,会在末尾填充0以确保对齐)。因此,添加选项后,报文头的总长度可能变成20字节、24字节、28字节……最多60字节。
由于数据偏移字段以4字节为单位,所以它能表示的长度必须是4的倍数:5×4=20,6×4=24,……,15×4=60。这就是为什么最大是60字节(15 × 4)。
理论上,4位二进制可以表示0~15,但在TCP中,报文头长度不可能小于20字节。如果数据偏移字段的值小于5(即小于20字节),那么报文头就容纳不下固定部分的20字节,这显然是不合理的。因此,任何合法的TCP报文头,数据偏移字段的值至少为5。
另外,如果报文头长度超过60字节(即超过15 × 4),由于字段只有4位,无法表示更大的长度,所以TCP规定选项部分的总长度最多为40字节(因为20字节固定部分 + 40字节选项 = 60字节)。因此,数据偏移字段的取值范围被限制在5到15之间。
为什么报头不可能小于20字节?
TCP报文头至少包含以下固定字段(共20字节,每段都是4字节对应4*8个bit位):
-
源端口(16位)+ 目的端口(16位)