tcp提供一种可靠的,面向连接的字节流服务。tcp传递给ip的信息单位称报文段。TCP将用户数据报打包构成报文段;它发送数据后打开一个定时器;另一端对收到的数据进行确认,对失序的数据重新排序,丢弃重复数据;tcp提供端到端的流量控制,并计算和验证一个强制性的校验和。
1.tcp报文头 20字节
-
16位源端口号
-
16位目的端口号
两个端口号加上ip的两个ip地址确定唯一的tcp连接。也做校验和使用,检测传输过程中是否出现差错。 -
32位序号 :0 到2的32次方 - 1,用于标识tcp发端向tcp收端的字节流。
-
32位确认序号:当ack为1时生效,值为上次成功接收字节的序号加一
-
4位首部长度
-
6位保留
-
URG:紧急指针有效
-
ACK:这个标志位为1时,确认序号生效。连接被建立这个字段总为1
-
PSH:通知接收方应该尽快把这个报文交给应用层
-
RST:重建连接 ,可以用来释放连接。称异常释放。
-
SYN:同步序号用来发起一个连接。新建连接是为1,序号位为初始序号ISN(INITIAL EQUENCE NUBER),ISN随时间而变化,可看做一个32比特的计算器,每4ms加一。每个交互报文都会占一个序号。而这里使用ISN。发送的第一个字节序号为ISN + 1
-
FIN:发端完成发送任务
ps:标志位均占一位 -
16位窗口大小
-
16位紧急指针
其他说明
跟udp一样包含一个有一个伪首部包含源端跟目的端的IP地址,被校验和覆盖
可选字段可以用于扩充窗口大小或这点MSS(max segment size)最长报文大小
2.建立连接
三次握手,建立双向通道。建立连接的最长时间限制为75秒。ex:500ms定时器,第一次6秒,第二次24秒,直到75秒超时。
建立连接过程中设定的那些值:
1.如果使用滑动窗口会设定滑动窗口的大小;
2.设定mss的大小,默认为536.以太网可达1640
3.断开连接
四次握手;存在一种半关闭的状态。由于是双向通道,当一个通道发送FIN告诉对端传输结束,进入半关闭状态,此时对端还能传输数据。一端发送FIN主动关闭,另一端回复ACK。当另一端也完成传输后发送FIN执行被动关闭。双方确认传输结束后断开连接。
半关闭是一种状态,代表自己已经完成传输工作了,但你还是可以给我发送数据的。
4.状态分析
close(不存在这种状态,为了方便描述)这里暂且设置为初始状态。
主动打开状态变迁过程:
client:syn-sent service:syn_rcvd
service收到ack后变为 established 工作状态
进入established状态可以双向传输了
知道一方传输结束,主动发出fin, 然后进入fin_wait_1,接受到回应后进入fin_wait2状态,接收到对端FIN信后回应ACK后进入2msl状态 (主动关闭才会出现该状态)
处于2msl状态时会占用端口。异常情况下,重启服务器,此时使用2msl状态的端口建立连接,会出现把异常之前发生的报文的应答当做新连接的报文。为了避免这种情况,重启后MSL时间(平静时间)内部不允许建立连接。但一般主机重启都超过MSL时间。
5.服务器的设计
存在两个队列,请求队列和处理队列。
请求队列用于缓存当前请求,该队列存在一个积压值,如果超过积压值则拒绝连接。应用层队列会根据执行情况把任务从请求队列中取出并处理。
队列已满的情况下,tcp不会接收SYN也不发回RST做为应答,这是一个软错误。
6.negal算法
这个算法目的是为了提高带宽的利用率。因为存在发送很多小报文的情况,negal通过延长合适时间(一般采用200ms),让发送端有时间缓存更长的数据,一次性发送。如果实时性要求高的场景,可以通过TCP_NODELAY来关闭。
7.滑动窗口、拥塞窗口
发送接收双方都拥有一个数据缓存区,会缓存发送或接收的数据,而接收方根据自身缓存区的情况来控制连接的滑动窗口win(窗口更新),通知发送端。发送端可以根据网络情况调整拥塞窗口的值cwnd,在堵塞的情况下会采用慢启动算法,这个算法会把cwnd设置为1(实质上这个是以字节为单位),并在达到启动阀值之前指数增长。
8.慢启动算法
cwnd = 1,在达到启动阀值前指数增长。
9.拥塞避免算法
慢启动达到阀值后执行拥塞避免算法,cwnd的值平缓增加。
10.快速重发和快速恢复算法
当发送端收到3个重复的ack时判断为报文丢失,并认为网络堵塞,但是既然能收到3个ack,就代表数据还能被接收,此时执行快速重传。慢启动阀值ssthresh设置为当前窗口的二分之一(max(min(win,cwnd),2);并重传数据,接收到ack后,提高cwnd的值,如果cwnd比ssthresh小指数增加,如果超过执行拥塞避免。
出现超时的情况采用快速恢复算法,使用慢启动,后面增加的方式跟快速重传算法一样。
11.糊涂窗口
1.接收端不通告小窗口。不通告一个比当前窗口大的窗口,除非能增加一个报文段的大小,或者能增加接受方缓存空间的一半,不论多少。调整缓存空间可以突破界限,但前提是能增加一半或以上。
2.发送方满足条件:1发送满长度的报文。2可以发送至少是通过窗口大小一半的报文段。3能够发送当前数据并不希望接收ACK,相当于没有未确认的数据,或者禁用nagle算法。
12.每一个连接的4个定时器
1.重传定时器适用于当希望收到另一端的确认,作重传计时。
2.坚定定时器使窗口大小信息保持不
断流动,即使另一端关闭了其接收窗口。
3.保活定时器可检测到一个空闲连接的另一端何时崩溃或重启。
4.2MSL定时器测量一个连接处于TIME_WAIT状态的时间。
网友评论