传输层协议
TCP
TCP是一种面向连接的传输层协议,可提供可靠的传输服务
UDP是一种面像无连接的传输层协议,提供不可靠的传输服务
TCP端口号
知名端口号:0-1024 已经被服务占用的端口号
PC使用的端口号 1025-65535
TCP头部
TCP连接的建立
1、SYN 表明想和对面建立TCP连接
1、seq(序列号) 建立可靠连接
2、SYN,ACK 通过seq a+1表示收到你想要和我建立连接的消息
2、通过序列号b,表明我也想和你建立连接
3、seq为对方的ack,我的ack为对方的seq+1表明完成TCP建立
三次握手超时机制
SYN第一次发送等待2^0=1s,没有收到ACK重传
SYN第一次发送等待2^1=2s,没有收到ACK重传
SYN第一次发送等待2^2=4s,没有收到ACK重传
SYN第一次发送等待2^3=8s,没有收到ACK重传
SYN第一次发送等待2^4=16s,没有收到ACK重传
SYN第一次发送等待2^5=32s,没有收到ACK重传
SYN第一次发送等待2^6=64s,没有收到ACK重传
尝试7次,一共127s,建立TCP失败,从头开始建立
TCP连接的拆除
FIN 我想和你关闭TCP连接,发送序列号seq=p给主机B(如果带ACK表示确认数据传输完成),主机B收到主机A的seq后,发送ack给主机A做确认并且发送序列号q给主机A,主机A收到序列号q之后发送ack给主机B,并且关闭TCP连接,主机B收到A的ACK后也关闭TCP连接。
TCP传输确认
TCP采用窗口传输机制来传输数据;窗口传输机制会自动协商一次性传输多少字节之后来进行确认。比如主机A传输8192子节的数据给主机B,这时候窗口传输机制通过算法算出一次性传4096个数据给主机B之后进行确认。第一个数据的序列号(seq)是三次握手中最后一次握手的序列号。之后的序列号(seq)都是上一个len+seq。第一个窗口4096子节传输完毕之后,主机B会给主机A发送一个确认ack=最后一个数据的seq+len。第一个窗口传输完毕之后,会进行第二个窗口传输,第一个数据的序列号是上一个ACK的值,之后就是以此类推。
TCP超时重传
1、如果DATA(seq=1025,len=1024)数据丢失,主机B就会发送ACK=1025给主机A,主机A等待一个RTO时间,如果还未收到正常的ACK计时器超时就会重传。
2、最后一个数据包为结束的标致,如果主机B没收到最后一个数据包,主机B不会发送ACK消息,主机A等待一个RTO(重传超时)时间,如果还没收到RTB的ACK消息,则会重新传输数据。如果第一次重传失败,接下来的重传时间为2^1*RTO,第三次重传时间为2^2*RTO,一般重传三次;如果重传三次都失败,TCP就会重新三次握手建立连接。
3、如果重传数据段之后,又收到了之前丢失的数据段(收到重复的数据段)。如果该数据段未被上层协议处理,后面的收到的数据段覆盖前面的数据段。如果数据段已经被上层协议处理,丢弃后面的数据段。
Windows最多重传5次
Linux最多重传15次
RTO(重传超时)=RTT+4*RTT
RTT(往返时延)=传播时间(往返链路的时间)+排队时间(路由器、交换机等待处理数据的时间)+数据处理时间(应用,封装)
TCP轻微失序&TCP严重失序
轻微失序
数据段在传输过程中会出现阻塞情况,图中(seq=4,len=10)数据段出现阻塞,下面的数据提前发给对面,这时被发送方会回复发送方一个阻塞数据段的ACK,如果说阻塞的那个数据段恢复了正常,被发送方会发送正常的ACK。如果阻塞的数据段迟迟没有发送,超过了超时时间,发送方就会超时重传。
严重失序
数据段在传输过程中会出现阻塞情况,图中(seq=4,len=10)数据段出现阻塞,下面的数据提前发给对面,这时被发送方会回复发送方一个阻塞数据段的ACK,此时收到3个重复的ACK,如果重复的ACK出现3次以内,直接忽略。达到三次,称之为严重失序,出发TCP快速重传机制,如果说阻塞的那个数据段恢复了正常,被发送方会发送正常的ACK。
快速重传机制:停止发送即将发送的数据段,只发送丢失的数据段。
UDP
UDP头部
UDP传输过程
- UDP不提供重传机制,占用资源小,处理效率高
- 一些时延敏感流量,如语音,视频等,通常使用UDP作为传输层协议