TCP学习

一.握手

首先

1.TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态;
2.TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,这是报文首部中的同部位SYN=1,同时选择一个初始序列号 seq=x ,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。
 

3.TCP服务器收到SYN请求报文以后,如果同意连接就需要发出确认报文,确认报文当中应该设置确认号字段ACK=1,同步字段SYN=1,确认号的值ack = x + 1,同时也要为自己初始化一个序列号seq = y,此时TCP服务器进程进入了SYN-RCVD(同步接收)状态,这个报文也不能携带数据,但是同样要消耗一个序号。

4.TCP客户端进程收到确认报文后,还要再给服务器发出一个确认报文,(不然如果两次连接就建立连接的话服务器进程的确认报文有没有到达客户端都是不可知的从而会导致连接可能还没有建立双发就在发送无效的数据报文, 还有就是防止已经失效的连接报文再次传送到了服务器端.这样会再次建立连接导致不必要的错误和资源浪费.三次连接的话客户端不会再发送确认报文,这样失效的连接报文就无法再让双方建立连接)。确认报文的ACK = 1,ack = y+1, 自己的序号为seq = x +1, 此时客户端进入了ESTABLISHED状态,TCP规定ACK报文可以携带数据,不携带数据的话就不消耗序号.

4.服务器进程收到了来自客户端的确认以后也进入ESTABLISHED状态.然后双方建立通信连接,开始通信。

二.挥手

数据传输完毕后,双方都可释放连接。最开始的时候,客户端和服务器都是处于ESTABLISHED状态,然后客户端主动关闭,服务器被动关闭。

1.客户端进程发出连接释放报文, 停滞发送数据,释放数据报文首部,FIN = 1, 序列号为seq = u(等于前面已经传送过来的数据的最后一个字节的序号 + 1), 此时客户端进入FIN-WAIT-1(终止等待1)状态. TCP规定FIN报文即使不携带数据,也要消耗一个序号.

2.服务器收到连接释放报文,发出确认报文,ACK = 1, ack = u +1,并且带上自己的序列号seq = v , 此时服务端已经进入了CLOSE-WAIT(关闭等待)状态,TCP服务器这时通知高层的应用进程,将客户端向服务器的方向释放,这时处于半关闭状态,即客户端没有数据要发送了,但是服务端发送数据客户端依然要接收,在CLOSE-WAIT状态中会一直持续这个现状。

3.客户端收到了服务端的确认请求后,此时客户端进入FIN-WAIT-2(终止等待2)状态,等待服务端发送连接释放报文。

4.服务端没有数据要发送了,就向客户端发送连接释放报文,FIN = 1, ack = u + 1,由于在半关闭状态,服务端可能在CLOSE-WAIT期间又发送了部分数据,所以它的seq = w, 此时服务端进入了LAST-ACK(最后确认状态),等待客户端的确认。

5.客户端收到服务器的连接释放报文后,必须发出确认报文回复,ACK = 1, ack = w+ 1,而自己的序号是seq = u + 1,此时客户端就进入了Time-WAIT(时间等待)状态,此时TCP连接还没有释放,必须经过2 * MSL(最大报文段寿命)的时间后,客户端撤销相应的TCB后,才进入CLOSED状态.

6.服务器只要收到了客户端的确认报文后就立即进入CLOSED状态,同样撤销TCB结束这次TCP连接,显然服务端肯定比客户端结束的早.

TCP Control Block的简称:

在网络传输层tcp模块中有一个tcb(传输控制模块,transmitcontrolblock),它用于记录tcp协议运行过程中的 变量。对于有多个连接的tcp,每个连接都有一个tcb。tcb结构的定义包括这个连接使用 的源端口、目的端口、目的ip、序号、应答序号、对方窗口大小、己方窗口大小、tcp状态、top输入/输出队列应用层输出队列、tcp的重传有关变量。

三. 拥塞控制和流量控制

拥塞控制与流量控制的区别 
拥塞控制是防止过多的数据注入到网络中,可以使网络中的路由器或链路不致过载,是一个全局性的过程。 
流量控制是点对点通信量的控制,是一个端到端的问题,主要就是抑制发送端发送数据的速率,以便接收端来得及接收。

1.慢开始:慢开始不是指拥塞窗口的增长速度慢(指数级增长), 而是指TCP开始发送设置cwnd(拥塞窗口) = 1

2.为了防止网络拥塞,我们一开始不会发送大量的数据,而是探测网络的拥塞程度,从小到大逐渐增加拥塞窗口的大小,以TCP的报文段的个数为单位,每个轮次拥塞窗口的容量进行翻倍。(实际拥塞窗口大小是以字节为单位的)

3.防止拥塞窗口过大,需要设一个慢开始门限值ssthresh,

当cwnd< ssthresh使用慢开始算法

当cwnd = ssthresh时即可用慢开始算法,也可以用拥塞避免算法。

当cwnd > ssthresh时使用拥塞避免算法

拥塞避免(按线性规律增长)
1.拥塞避免并非完全能够避免拥塞,是说在拥塞避免阶段将拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。 
2.思路:让拥塞窗口cwnd缓慢地增大,即每经过一个往返时间RTT就把发送方的拥塞控制窗口加一。


无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认,虽然没有收到确认可能是其他原因的分组丢失,但是因为无法判定,所以都当做拥塞来处理),就把慢开始门限设置为出现拥塞时的发送窗口大小的一半。然后把拥塞窗口设置为1,执行慢开始算法。 

快重传与快恢复

(1)快重传

1.快重传要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方)而不要等到自己发送数据时捎带确认。快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。

å¿«é传示æå¾

2.由于不需要等待设置的重传计时器到期,能尽早重传未被确认的报文段,能提高整个网络的吞吐量。

(2)快恢复(与快重传配合使用)
1.采用快恢复算法时,慢开始只在TCP连接建立时和网络出现超时时才使用。 
2.当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把ssthresh门限减半。但是接下去并不执行慢开始算法。(慢开始的话会将拥塞窗口又重置而不是到门限值) 
3.考虑到如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为网络可能没有出现拥塞。所以此时不执行慢开始算法,而是将cwnd设置为ssthresh的大小,然后执行拥塞避免算法。

 

发送方窗口的上限值=Min(接受窗口rwnd,拥塞窗口cwnd)

TCP拥塞机制:TCP通过定时器

 

TCP的传输效率问题:

第一种: 维护一个变量等于最大报文段长度MSS, 缓存中存放的数据达到MSS字节后组装成一个TCP报文段发送

第二种:发送方的应用进程指明要求发送报文段,即TCP支持的推送操作。

第三种:发送方的一个计时器期限到了,把当前已有的缓存数据装入报文段。

TCP的Nagle算法(Netty中会用到相关的配置):发送方先把到达的第一个数据字节发送出去,把后面到达的数据字节缓存起来,等收到第一个数据字节的确认后再把发送缓存中的所有数据组成一个报文段发送出去,同时对随后到达的数据进行缓存。当数据到达较快而网络较慢时,可以明显的减少网络带宽(因为一个报文段我只用一次确认一个数据字节了),Nagle算法還規定,当到达的数据已达到发送窗口大小的一半或已经达到报文段的最大长度时就立即发送一个报文段。可以有效提高网络吞吐量。

 

https://blog.csdn.net/shuxnhs/article/details/80644531

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值