- UDP协议
- TCP协议
文章目录
- 传输层
- 一、概述
- 二、TCP报文格式
- 三、TCP的可靠交付原理
- 四、TCP连接建立
- 五、TCP连接断开
- 六、TCP流量控制
- 七、TCP拥塞控制
- 1. 慢开始算法
- 2.拥塞避免
- 3.快重传
- 4.快恢复
- 另
一、概述
TCP协议特点:
- TCP协议是面向连接的协议,就是说在使用TCP协议之前,必须向建立TCP连接
- TCP协议是端对端的(UDP可以一对多,一对一),TCP只能一对一
- TCP提供可靠交付的服务,通过TCP连接传输的数据,无差错,不丢失,不重复,按需到达
- 面向字节流,这意味着上层应用交付给TCP的数据(可能是某些数据结构形成的数据块)对TCP来说是没什么意义的,TCP把它当成普通的二进制字节流,并对这个字节流的传输提供可靠服务。接收方的应用进程应该要具有能够识别字节流并还原为有意义的应用层数据的能力。
- TCP不关心应用进程一次把多少报文发送到TCP的缓存中,而是根据对方给出的接收窗口(流量控制)和网络拥塞程度(拥塞窗口)来决定发送的报文段中包含多少字节。
- 对过长的报文,TCP会把它划分为较短的报文后发送出去;对很短的报文,比如应用进程只发了一个字节,TCP恶意等待积累有足够多字节后再构成报文段发送出去。
二、TCP报文格式
- 源端口,目的端口
- 序列号:每个报文的序列号对应当前发送报文的第一个字节的序列号,如上一次发送方发送的序列号为1001,数据段长度为1000字节,则下一次报文的序列号为2001
- 确认号:累计确认机制,但有些区别,收到ACK(n),表示到n-1的序列号全部确认,序列号为n的没有确认
- 特殊位:
- URG
- ACK:在建立连接后,这一位均为1
- PUSH
- RST:TCP报文出现严重错误时置1
- SYN:TCP连接建立时,SYN置1
- FIN:TCP断开连接时,FIN置1
三、TCP的可靠交付原理
TCP的可靠交付的核心是滑动窗口协议,原理参考blog
但有一些区别:
- GBN中的ACK(n)是序号n之前(包括n)的数据报全部确认受到,TCP中的ACK(n)是指到n-1全部收到,n还没有收到(接收方期待收到的)
- 发送方滑动窗口的大小会变化
- 采用了快速重传机制
快速重传机制:是区别丢包和网络拥塞的一种机制;GBN情况下,如果发送方发送的数据报丢失,发送方必须要超时后才重传;网络拥塞情况下,也是超时重传,两种情况无法区分的情况下不利于TCP的拥塞控制。为了区分这两种情况,添加了快速重传机制,即发送方受到连续三个重复确认,就知道发送时丢包了,开始重传丢失的包。
四、TCP连接建立
TCP连接建立基于三次握手,详细过程如下
- 客户端发送请求建立连接的报文,报文中SYN=1表示请求建立连接,设定初始序列号seq=x
- 服务器收到请求报文后,选择初始序列号y,发送SYN=1,ACK=1,ack_seq=x+1,seq=y的报文给服务端
- 客户端再发送ACK=1,seq=x+1,ack_seq=y+1给服务器,连接建立
至于为什么是三次握手—answer
五、TCP连接断开
TCP连接断开基于四次握手,注意:客户端发送最后一次握手信息后,还需要等待若干时间才能结束等待状态。
六、TCP流量控制
TCP流量控制基于接收方发送的接收窗口大小,流程如下:
- A向B发送数据,连接建立时,B告诉A接收窗口大小为400字节,所以发送方的发送窗口大小不能超过接收方的接收窗口大小
- B改变接收窗口大小,调整为300字节,由于201-300的序号丢失(在窗口中没有确认),所以只能发送200字节的数据
- B调整接收窗口大小为100字节,A发送窗口大小调整为100字节
- B调整窗口大小为0字节,此时A不能再发送数据
流量控制关注的是接收方能否缓存下并及时处理TCP字节流,这是为了防止发送端发送数据速率过大导致接收方无法缓存下字节流(CPU速度不够快或者缓存大小不够大);区别于TCP拥塞控制,拥塞控制关注的是整个网络的情况
七、TCP拥塞控制
TCP拥塞控制关注整个网络的拥塞情况。事实上,如果没有拥塞控制机制,并且由于超时发送方不断重传,会导致发送到网络中的数据越来越多,网络越来越拥塞。
TCP的拥塞控制算法有四种:慢开始,拥塞避免,快重传,快恢复。为了便于分析,假设接收方有足够大的缓存,则发送方的窗口大小由网络的拥塞程度决定。
网络拥塞的依据就是出现了超时,这是因为现在通信线路质量非常高,出现传输差错而丢弃分组的概率非常小(远小于1%)。
1. 慢开始算法由于主机开始发送数据的时候,不清楚网络的拥塞情况,此时应该试探性的发送数据,探测网络情况,并从小到大逐渐增大发送窗口。慢开始规定,没收到一个对新的报文段的确认之后,拥塞窗口增加一个最大段(SMSS)的数值,具体流程如下(单位均为SMSS,最大段)
- 开始时,发送窗口大小设置为1,发送方发送1个最大段的数据
- 发送方收到ACK信息后,将发送窗口增加1,即变为2,并发送2,3
- 发送方收到2,3的ACK信息后,将发送窗口增加2,变为4,并发送4,5,6,7
- 发送方接受到ACK后,发送窗口调整为8
- 发送方接受到ACK后,发送窗口调整为16
可以看出,这个过程中发送窗口的大小实际上是指数型增长的 ,并且接受方可以使用累计确认机制,并不需要每一个段发送一个ACK。
这里首先需要引入一个概念threshold,这个状态变量是为了防止慢开始无限度进行指数型增长。当达到这一阈值后,就不是每收到一个ACK发送窗口加一,而是每一个传输轮次ACK发送窗口+1.
当出现超时现象,即认为网络出现拥塞,这时候threshod大小减为原来的一半,同时再次启动慢开始算法(发送窗口从0开始)
快重传机制是为了保证当网络出现丢包(而不是超时)时,发送方不等待直到超时,而是收到三个重复ACK后直接重传丢失的包。这是因为当收到重复ACK信息,说明后面的包都成功接收,网络的运作情况应该是良好的,只是某个包出现丢失。
当遇到丢包现象时,只需将threshod调整为原来的一半,并且将拥塞窗口的大小改为调整后的threshold
当遇到丢包现象时,只需将threshod调整为原来的一半,并且将拥塞窗口的大小改为调整后的threshold。并执行拥塞控制算法(即拥塞窗口线性增长)
实际情况中,拥塞窗口和接收窗口大小共同决定发送方的发送窗口大小,即
S
e
n
d
e
r
W
i
n
d
o
w
=
M
i
n
(
c
o
n
g
W
i
n
d
o
w
,
R
e
c
v
W
i
n
d
o
w
)
Sender Window = Min(congWindow, RecvWindow)
SenderWindow=Min(congWindow,RecvWindow)



