传输层
传输层
传输单元:段/报文段
功能
- 提供进程与进程间的逻辑通信
- 复用和分用
- 差错检测
端口
这里的端口指的是计算机的逻辑端口。
端口号长度为16bit,能表示65535个不同的端口号。
服务端使用的端口号
-
熟知端口号(0~1023):给TCP/IP最重要的一些应用程序使用
-
登记端口号(1024~49151):为没有熟知端口号的应用程序使用
客户端使用的端口号
在客户进程运行时动态选择的端口号(49152~65535)
个人补充(可能错误):在应用启动时会占用一个进程,进程有自己的PID,当数据段进入特定端口时,再进入指定进程完成进一步通信。即进程属于应用层部分,端口属于传输层部分
传输层的复用与分用
复用:发送方不同的应用进程 可使用 同一个传输层协议 传输数据
分用:接收方的传输层去掉报文段首部时,能正确交付目标应用进程
其他复用分用方法可参照:复用和分用
UDP
特点
- UDP使用无连接服务,减少开销和发送数据之前的时延。
- UDP无拥塞控制,适合实时应用
- UDP使用最大努力交付,即不保证可靠交付。
- UDP是面向报文段的。应用程序交付的报文段,UDP既不合并,也不拆分,直接添加首部以后交给网络层添加首部。
UDP头
每个字段大小:2字节 = 16bit,即UDP首部大小为8字节
16位源/目标端口号
表示源/目标主机的端口号
可表示端口号0 - 65535,如该字段为00100100 01011100时表示端口号为9308
16位UDP长度
单位:字节
表示整个UDP报文段的大小(UDP头+数据)
但该字段为00000000 00010010 表示整个UDP报文段大小为18字节
16位UDP检验和
通过计算而来,用于检验UDP数据段是否有误
TCP与UDP计算过程类似,不重复介绍,在这讲出。
计算过程:
伪首部只有在计算检验和的时候出现。
伪首部字段:
- 源IP地址:32位,表示发送方的IP地址。
- 目标IP地址:32位,表示接收方的IP地址。
- 保留字段:8位,全置为0。
- 协议类型:8位,表示上层协议类型,UDP的协议类型值为17,TCP则为6。
- UDP长度:16位,表示UDP头部和数据部分的总长度。TCP则表示TCP头部和数据部分总长度,以字节为单位。
过程:
详细计算过程可参照:二进制反码求和运算)
TCP
特点
- TCP是面向连接(虚连接)的传输层协议。如打电话
- 每一条TCP连接只能有两个端点【这里的端点指socket(套接字) = (主机IP地址:端口号),可标识具体进程】,每一条TCP连接只能是点对点的。
- TCP提供可靠交付的服务,无差错、不丢失、不重复、按序到达。
- TCP提供全双工通信。通信双方能够同时发送和接受数据。因此通信双方都有发送缓存和接收缓存。
- TCP面向字节流。TCP协议将应用层传递下来的数据视为一串无结构的字节流
4、5点模型
框框代表报文段,发送方和接收方都有自己的发送缓存和接收缓存
TCP头
源端口/目标端口
表示源/目标主机的端口号
序号seq
大小:4字节
报文段数据部分(字节流的)第一个字节的序号(一个字节==一个序号)
确认号
大小:4字节
期待收到对方的下一个报文段的 字节流的 第一个字节的序号
若确认号为N,则表示前N-1的数据都已成功接收
数据偏移
大小:4bit(可表示0-15)
单位长度:4B
表示TCP报文段的首部长度,当该字段为1111时,表示TCP报文段的首部长度为60字节。
保留
大小:6字节
留着日后使用,当前全置0
控制位
紧急URG:URG为1时,代表该报文段有紧急数据,不用在缓存里排队,优先传输。配合后面的紧急指针使用
确认ACK:当ACK=1时,上面的确认号字段才有效,ACK=0时无效,连接建立后,所有的的报文段都必须把ACK置为1
推送PSH:当PSH=1时,接收方会直接交付该报文段(不是整个接收缓存)给上层应用程序,不需要等待接收缓存满(很少使用该操作)
复位RST:当RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后重新建立连接,可用于拒绝非法报文段或拒绝打开一个连接
同步SYN:当SYN=1&&ACK=0时,表明这是一个连接请求报文段,若对方同意建立连接,则应在响应报文段使SYN=1&&ACK=1,连接请求 / 连接接受的报文的SYN才为1,其他一般为0。后面的三握四挥再深入了解
终止FIN:当FIN=1时:表面该报文段数据发送完毕,要求释放连接。
窗口
大小:2字节
指发送该报文段的一方的 接收窗口大小(即接收缓存还可接收的数据大小),当接收缓存满时,会发送窗口为0的报文段给发送方,阻塞接收报文段,当程序读取接收缓存数据时恢复。
检验和
大小:2字节
与UDP检验和过程类似
紧急指针
大小:2字节
只有在上面紧急URG=1时才有效,指出本报文段中的紧急数据的字节数,即使窗口为0也可发送紧急数据
选项
选项内容有:最大报文段长度MSS、窗口扩大、时间戳、选择确认等。。。
填充
用来填充TCP首部长度为整数(4B的倍数)
TCP连接管理
TCP连接管理有三个阶段:连接建立、数据传送、连接释放
需客户端主动向服务器端进行连接建立
连接建立
三次握手阶段
过程(与图中一样):
- 客户端向服务器发送序号seq=x(由客户端随机分配)、同步SYN=1、确认ACK=0的连接请求报文段,该报文段无应用层数据。
- 服务器收到该报文段时,为接收缓存、发送缓存和变量 分配空间,并向客户端返回序号seq=y、同步SYN=1、确认ACK=1、确认号ack=x+1(表示期待收到的下一个报文段序号)的连接接受报文段,该报文段无应用层数据。
- 客户端收到该确认报文段后就分配发送缓存和接收缓存,并向服务器返回SYN=0、ACK=1、seq=x+1、ack=y+1的报文段,该报文段客携带数据
注:SYN在连接请求 / 连接接受的报文时才为1,ACK=1是用来让确认号有效
连接释放
四次挥手阶段
过程(与图一样,以客户端主动关闭为例):
- 客户端主动发送终止FIN=1、seq=u(随机生成)的连接释放报文段
- 服务器返回ACK=1,seq=v,ack=u+1的确认报文段,此时处于半关闭状态
- 服务器主动向客户端发送终止FIN=1、ACK=1,seq=w,ack=u+1的连接释放报文段
- 客户端返回ACK=1,seq=u+1,ack=w+1的确认报文段,然后等待2MSL(最长报文段寿命的两倍)时间,连接彻底关闭。
等待2MSL 是为了防止 最后的确认报文段丢包,导致服务器没彻底关闭连接(服务器未收到确认报文段时,会有下面会讲的重传机制)
补充:在SYN泛洪攻击中,攻击者通过不断发送大量的伪造源IP的SYN请求给目标服务器,使得服务器不断为每个请求分配资源,并等待对应的ACK响应。由于请求中的源IP是伪造的或不存在的,服务器无法收到ACK响应,从而造成资源的浪费和服务不可用。SYN泛洪攻击是一种比较简单但有效的DDoS攻击方式
TCP传输特性
可靠传输
机制:校验、序号、确认、重传
- 校验
与UDP校验方法一样,添加伪首部
- 序号
应该与TCP头的序号理解一样,一个字节占一个序号
- 确认
当接收方接收缓存中的报文段数据没有交付给应用层时,发送方的接收缓存会保留该报文段,接收方应用层接收后,会给发送方发送确认报文段(累计确认和捎带确认两种方式),确认报文里的确认号为N(来表示前N-1成功接收),发送方才会将发送缓存的前N-1报文段数据删除
- 重传
如图,此时7、8报文段成功到达但456因为某些原因没到达,接收方依旧发送确认号为4的报文给发送方。发送方就会进行456的重传。
重传机制:
超时重传:超过规定的时间(重传时间)没有收到接收方的确认报文段,就会重传。这里使用自适应算法,动态改变重传时间RTTs(加权平均往返时间)
快速重传:假设报文段1、2、3、4、5,报文段的1、3、4、5被接收方接收了,但2没有,因此接收方一直返回确认号为2的报文段(即冗余ACK(又叫冗余确认)),当发送方收到3个这样的报文段,就会进行重传
流量控制
滑动窗口机制
接收方设置好确认报文段的窗口字段 将rwnd(接收窗口)告诉发送方,发送方的发送窗口取rwnd(接收窗口)和cwnd(拥塞窗口)的最小值
个人tips(可能有误):接收方的接收缓存的可用空间大小==接收窗口大小
当不考虑拥塞窗口时,发送方发送窗口的大小==接收方接收窗口大小
发送窗口可动态变化
接收窗口:由接收方 根据接收缓存空间设置,反映接收方可用容量
拥塞窗口:由发送方 根据网络拥塞程度设置,反映网络当前容量
当发送方接收到一个窗口值为0的确认报文段时,会启动持续计时器,当持续计时器到期时,发送方会发送一个零窗口探测报文段,接收方收到这个报文段时会返回现在的窗口值(以上是为了防止接收方的确认报文段丢失,并且发送方接收到的前一个报文段的窗口值为0时,导致的互相等待的情况)
拥塞控制
拥塞:某段时间,对网络中某一资源的需求超过了该资源所能提供的部分,导致网络性能变差。
图解拥塞控制和流量控制区别:
拥塞控制算法
前提假设:1、一方传送数据,另一方只传送确认;2、发送窗口取决于拥塞窗口
- 慢开始+拥塞避免
过程略
- 快重传+快回复
过程略
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)