传输层
UDP
UDP只在IP数据报服务之上添加了复用分用和差错检测功能。
特点
- 无连接,开销少,时延低
- 不保证可靠交互
- 面向报文,适合一次传输少量数据的网络应用。(应用层传输多长的报文UDP就发送多长,一次性发送)
- 无拥塞控制,适合实时应用
- 首部开销少,8B。
首部格式
首部一共8B(64位)
16位源端口号,16位目的端口号,16位UDP长度,16位UDP检验和
首部前面还有一个模仿IP的伪首部
伪首部用来计算检验和,只有计算检验和的时候才出现,不向下传送也不向上递交。
TCP
特点
- 面向连接的传输层协议
- 每一条TCP只能连接两个端点,即只能点对点连接。
- 可靠服务,保证无差错、不丢失、不重复、按顺序
- 全双工通信
- 面向字节流。
- 拥有发送缓存和接收缓存保证数据传输。
报文段首部格式
16位源端口
16位目的端口
32位序号:表示本报文段所发送的数据的第一个字节在总数据中的序号。
32位确认号:期望收到下一个报文段的第一个字节的序号
数据偏移:首部长度
1位紧急位URG:1时数据优先发送,不需要等待
1位确认位ACK:表示确认号有效,连接建立后所有的报文段把ACK设置为1
1位推送位PSH:1时尽快交付,无需在接收缓存中等待。
1位复位RST:1时表示连接出现差错,释放连接后重新建立
1位同步位SYN:1时表明是连接请求或者连接接受报文
1位终止位FIN:1时表示数据发送完,要求释放连接。
16位窗口:指发送报文段一方的接受窗口,即当前允许对方发送的最大的数据量
16位检验和:和伪首部一起食用
16位紧急指针:上URG=1时有意义,表示报文段中紧急数据的字节数(紧急数据在报文段中比非紧急数据前,即数据部分从头开始数就行)
可变字节选项:最大报文段长度,窗口扩大,时间戳等。
TCP连接管理
客户服务器方式,主动发起建立连接的为客户,被动等待连接的为服务器
建立连接三次握手:
- 客户端发送连接请求报文段,不包含应用层数据
- 服务器为该TCP连接分配缓存和变量,并向服务端返回确认报文段允许连接,不包含应用层数据
- 客户端为TCP连接分配缓存和变量,向服务器的确认返回确认,可以携带应用层数据
SYN洪泛攻击:
利用三次握手,攻击者对服务器发送三次握手中的请求报文段,但是不进行确认,使得TCP连接处于挂起状态,服务器超时接收不到确认会重新发送。当攻击者发送大量的该类连接,会消耗服务器的CPU和内存,有可能导致服务器死机。
连接释放四次握手:
参加TCP连接的两个进程中任意一个都能终止连接,结束后主机的资源会被释放。
- 客户端发送连接释放报文段,停止发送数据,主动关闭TCP连接
- 服务端返回却报文段,客户端到服务端方向的连接释放,处于半关闭状态。
- 服务器发完数据后发送连接释放报文段,主动关闭TCP连接。
- 客户端回送确认报文段,等待时长2MSL(两倍报文段寿命)后彻底关闭。等待是为了防止服务端没收到以重新发送。
TCP可靠传输
可靠:保证接收方进程从缓存区读出的字节流与发出的字节流是完全一样的。
机制
- 校验
伪首部
- 序号
根据序号排序,在首部里有
- 确认
接收端收到报文段后返回确认报文段,首部里有确认的数据(确认号),如果丢失某些数据报的话,确认报文段里面会有相应的内容(还是确认码)
- 重传
超时重传:规定时间内未收到确认就重传(RTTs加权平均往返时间)
冗余ACK:当期望序号大的失序报文段到达时,发送冗余ACK,指明下一个期待字节的序号。
TCP流程控制
滑动窗口
接收方根据自己的接收缓存大小,动态地调整发送方的发送窗口大小。通过首部的“窗口”实现。
当接收端传给发送端的窗口为0时,发送方不再发送,启动计时器,计时器时间结束后发送探测报文段问一下现在窗口是不是还是0,为了防止出现接收端将窗口调为非0但是发送方没收到的情况,这样会造成双方等待,死锁。
TCP拥塞控制
出现拥塞:对资源需求的总和大于可用资源(带宽、路由器等)
慢开始和拥塞避免
一开始建立连接后,发送方只发送1个单位的数据(一个报文段或者多个报文段,不固定),如果没有拥塞的话,接下来拥塞窗口大小程2的指数级增长。当增长到一定的大小时,进入拥塞避免状态,窗口大小程线性增长,一次只增加1个单位。遇到拥塞后拥塞窗口再次设置为1,重新开始慢开始和拥塞避免的过程。
快重传和快恢复
快重传:利用冗余ACK,在超时计时器结束前重新传输
快恢复:遇到拥塞(接收到3个重复的确认)将窗口值设置为原来的1/2,再重新进入拥塞避免状态,不用将窗口变为1再慢开始。