文章目录
传输层(Transport)
◼ 传输层有2个协议
- TCP(Transmission Control Protocol),传输控制协议
- UDP(User Datagram Protocol),用户数据报协议
UDP - 数据格式
- UDP是无连接的, 减少了建立和释放连接的开销
- UDP尽最大能力交付,不保证可靠交付
- 因此不需要维护一些复杂的参数,首部只有8个字节(TCP的首部至少20个字节)
◼ UDP长度(Length)
- 占16位,首部的长度 + 数据的长度
UDP - 检验和(Checksum)
◼ 检验和的计算内容:伪首部 + 首部 + 数据
伪首部:仅在计算检验和时起作用,并不会传递给网络层
伪首部的作用: 为了更安全, 更严谨
端口(Port)
◼ UDP首部中端口是占用2字节
- 可以推测出端口号的取值范围是:0~65535
◼ 客户端的源端口是临时开启的随机端口
◼ 防火墙可以设置开启\关闭某些端口来提高安全性
◼ 常用命令行
netstat –tulpn
:查看处于监听状态的端口、占用端口的应用程序
telnet 主机 端口
:查看是否可以访问主机的某个端口
例如:
telnet localhost 3306
Trying ::1…
Connected to localhost.
Escape character is ‘^]’.
TCP - 数据格式
◼ 数据偏移
- 占4位,取值范围是0x0101~0x1111
- 用于计算首部长度
- 乘以4:首部长度(Header Length)
- 首部长度是20~60字节
为什么叫数据偏移?
因为TCP首部有多长, 就说明TCP数据部分要偏移多少字节
◼ 保留
- 占6位,目前全为0
TCP - 小细节
- 有些资料中,TCP首部的保留(Reserved)字段占3位,标志(Flags)字段占9位
- Wireshark中也是如此
- 但其实两种说法都对, 因为9位的标志字段中有3个字段是没什么用的而且都是0
TCP - 一个细节
◼ UDP的首部中有个16位的字段记录了整个UDP报文段的长度(首部+数据)
◼ 但是,TCP的首部中仅仅有个4位的字段记录了TCP报文段的首部长度,并没有字段记录TCP报文段的数据长度
◼ 分析
UDP首部中占16位的长度字段是冗余的,纯粹是为了保证首部是32bit对齐
TCP\UDP的数据长度,完全可以由IP数据包的首部推测出来
传输层的数据长度 = 网络层的总长度 – 网络层的首部长度 – 传输层的首部长度
TCP - 检验和(Checksum)
◼ 跟UDP一样,TCP检验和的计算内容:伪首部 + 首部 + 数据
伪首部:占用12字节,仅在计算检验和时起作用,并不会传递给网络层
TCP - 标志位(Flags)
◼ URG(Urgent)
- 当URG=1时,紧急指针字段才有效。表明当前报文段中有紧急数据,应优先尽快传送
◼ ACK(Acknowledgment)
- 当ACK=1时,确认号字段才有效
◼ PSH(Push)
- 基本不需要去关注
◼ RST(Reset)
- 当RST=1时,表明连接中出现严重差错,必须释放连接,然后再重新建立连接
◼ SYN(Synchronization)
- 当SYN=1、ACK=0时,表明这是一个建立连接的请求
- 若对方同意建立连接,则回复SYN=1、ACK=1
◼ FIN(Finish)
- 当FIN=1时,表明数据已经发送完毕,要求释放连接
TCP - 序号、确认号、窗口
◼ 序号(Sequence Number)
- 占4字节
- 首先,在传输过程的每一个字节都会有一个编号
- 在建立连接后,序号代表:这一次传给对方的TCP数据部分的第一个字节的编号
◼ 确认号(Acknowledgment Number)
- 占4字节
- 在建立连接后,确认号代表:期望对方下一次传过来的TCP数据部分的第一个字节的编号
◼ 窗口(Window)
- 占2字节
- 这个字段有流量控制功能,用以告知对方下一次允许发送的数据大小(字节为单位)
TCP的几个要点
◼ 可靠传输
◼ 流量控制
◼ 拥塞控制
◼ 连接管理
- 建立连接
- 释放连接
TCP - 可靠传输 - 停止等待ARQ协议
◼ ARQ(Automatic Repeat–reQuest),自动重传请求
疑问
◼ 若有个包重传了N次还是失败,会一直持续重传到成功为止么?
- 这个取决于系统的设置,比如有些系统,重传5次还未成功就会发送reset报文(RST)断开TCP连接
TCP - 可靠传输 - 连续ARQ协议 + 滑动窗口协议
◼ 如果接收窗口最多能接收4个包
但发送方只发了2个包
◼ 接收方如何确定后面还有没有2个包?
- 等待一定时间后没有第3个包
- 就会返回确认收到2个包给发送方
TCP - 可靠传输 - 连续ARQ协议 + 滑动窗口协议
◼ 现在假设每一组数据是100个字节,代表一个数据段的数据
◼ 每一组给一个编号
TCP - 可靠传输 - SACK(选择性确认)
◼ 在TCP通信过程中,如果发送序列中间某个数据包丢失(比如1、2、3、4、5中的3丢失了)
◼ TCP会通过重传最后确认的分组后续的分组(最后确认的是2,会重传3、4、5)
◼ 这样原先已经正确传输的分组也可能重复发送(比如4、5),降低了TCP性能
◼ 为改善上述情况,发展出了SACK(Selective acknowledgment,选择性确认)技术
- 告诉发送方哪些数据丢失,哪些数据已经提前收到
- 使TCP只重新发送丢失的包(比如3),不用发送后续所有的分组(比如4、5)
TCP - 可靠传输 - SACK(选择性确认)
◼ SACK信息会放在TCP首部的选项部分
- Kind:占1字节。值为5代表这是SACK选项
- Length:占1字节。表明SACK选项一共占用多少字节
- Left Edge:占4字节,左边界
- Right Edge:占4字节,右边界
◼ 一对边界信息需要占用8字节,由于TCP首部的选项部分最多40字节,所以
- SACK选项最多携带4组边界信息
- SACK选项的最大占用字节数 = 4 * 8 + 2 = 34
- 所以如果后面还有就只能重传了