TCP协议

TCP报文的若干首部关键字段

确认ACK:仅当ACK=1时确认号字段才有效,当ACK=0时,确认号无效。TCP规定,在连接建立之后所有传送的报文字段都必须要把ACK置为1

同步SYN:在连接建立时用来同步序号,当SYN=1而ACK=0时,表明这是一个连接请求报文段,对方如果同意建立连接,则应该在响应的报文段使得SYN=1且ACK=1,因此,SYN=1就表明这是一个连接请求或者连接接受报文。

终止FIN:用来释放一个连接,当FIN=1时,表示此报文段的发送方的数据已经发送完毕,并要求释放运输连接。

序号:在一个TCP连接中传送的字节流中的每一个字节都按照顺序编号,整个要传送的字节流的起始序号必须要连接建立时设置。在连接建立时的序号用seq表示。

确认号:是期望收到对方下一个报文段的第一个数据字节的序号。在建立阶段用ack表示。

TCP的连接建立

  1. A在打算建立TCP连接时,向B发出一个连接请求报文,这时,首部中的同步为SYN =1,同时选择一个初始序号seq = x。
  2. B在收到A的连接请求报文后,如果同意建立连接,就在确认报文中把SYN = 1,ACK = 1。同时,设置确认号ack = x+1,同时设置自己的初始序号seq = y。
  3. A在收到B的确认之后,还要向B给出确认,确认报文的ACK置1,确认号ack为y+1,而自己的序号seq此时为x+1;

Q&A

Q:为什么A最后还要向B发送一次确认呢?

A:主要是为了防止已经失效了的连接请求报文突然又传到了B而产生错误。所谓已经失效了的连接请求报文是这样产生的,考虑一种正常情况:A发出连接请求,但是因为连接请求丢失而问收到确认。于是,A再重传一次连接请求,后来收到来确认,建立了连接,数据传输完毕之后,就释放了连接,A一共发出了两个连接请求报文段,其中一个丢失,一个到达了B.没有已失效的连接请求报文段。

现在假定出现了一种异常情况,即A发出的第一个连接请求报文并没有丢失,而是在某些网络节点长时间滞留了,以致于这个连接请求到了后来的某个时间才达到B.本来这是一个早就失效的报文段,但是B收到此失效的连接请求报文段之后,就误以为是A又发出了一次新的连接请求,于是就向A发出确认报文,同意建立连接,假定不采用报文握手,只要B发出确认,新的连接就建立了。

由于现在A并没有发出建立连接的请求,因此不会理睬B的确认,也不会向B发送数据,但是B却以为新的连接已经建立,并一直等待A的数据,B的许多资源就这样被白白浪费了。

TCP的连接释放

  1. A主动关闭TCP连接,A把连接释放报文首段的终止控制位FIN = 1;其序号seq = u,它等于前面已经传送过的数据的最后一个字节的序号加1.
  2. B收到连接释放报文后立即发出确认,确认号ack = u+1,而这个报文段自己的序号是v,等于B前面已经传送过的数据的最后一个字节序号加1.此时只是A到B的连接中断了。
  3. 如果B也没有要向A发送的数据了,就发出连接释放报文,假定此时B的序号是w(在半关闭的状态下B又发送了一些数据)B还必须重复自己已经发送过的确认号ack=u+1;
  4. A在收到B的连接释放报文段后,必须对此发出确认,在确认报文段中把ACK=1,确认号ack = w+1;而自己的序号seq = u+1;(根据TCP协议规定,A第一次发送FIN报文要消耗一个序号)

Q&A

Q:为什么要四次挥手

A:由于TCP是一个全双工的连接,这意味着连接的两端既可以发送数据,也可以接受数据。前两步只是表明A没有要发送给B的数据了,断开的只是A到B的发送数据的通过,并不影响A接受B的数据,前两步之后,如果B还有需要向A发送的数据,依然可以正常的发送给A,A也可以正常的接收到,只有当B也断开了给A发送数据的通道时,这个TCP连接才算真正的断开。所以综上所述,断开一个TCP连接需要四步。

流量控制

所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。利用滑动窗口机制可以很方便的在TCP连接上实现对发送方的流量控制。

拥塞控制

TCP进行拥塞控制的算法由四种:

  1. 慢开始
  2. 拥塞避免
  3. 快重传
  4. 快恢复

慢开始算法的思路是当主机开始发送数据额时候,由于并不清楚网络的负荷情况,所以,由小到大逐渐增大拥塞窗口数值。使用慢开始算法之后,每经过一个传输轮次,拥塞窗口就加倍。为了防止拥塞窗口增长过大引起网络拥塞,还需要设置一个慢开始门限,慢开始门限使用方法如下:

当拥塞窗口<慢开始门限:使用慢开始算法

当拥塞窗口>慢开始门限:使用拥塞避免算法

当拥塞窗口=慢开始门限:使用拥塞避免算法或者慢开始算法

拥塞避免算法的思路是让拥塞窗口缓慢增大,即每经过一个传输轮次把发送方的拥塞窗口加1,而不是像慢开始阶段那样加倍增长,因此在拥塞避免阶段就有加法增大的特点。

采用快重传算法可以让发送方尽早知道发生了个别报文段的丢失,快重传算法首先要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认,即使收到了失序的报文段后也要立即发出对已收到报文的重复确认,快重传算法规定,发送方一旦收到连续三个重复确认,就确认接收方存在报文丢失,就要立即进行重传。

在知道只是丢失了个别的报文段之后,并不启动慢开始,而是启动快速恢复。发送方调整门限为当前拥塞窗口的一半,并将拥塞窗口也减半,然后开始执行拥塞避免算法。

在拥塞避免阶段,拥塞窗口是按照线性规律增大的,称为加法增大,而一旦出现超时或者3个重复的确认,就要把门限值设置为当前拥塞窗口的一半,并大大减少拥塞窗口的数值,称为乘法减少。

拥塞控制和流量控制的区别

拥塞控制是为了防止过多的数据注入到网络,这样可以使得网络中的路由器或者环路不至于过载,是一个全局性的过程,涉及到所有的主机,所有的路由器,以及所有与降低网络传输性能相关的所有因素。

流量控制往往是点对点通信量的控制,是个端到端的问题(接收端控制发送端)流量控制所要做的就是抑制发送端发送数据的速率,以便使得接收端来得及接收。


  转载请注明: TomoFur TCP协议

 上一篇
长短连接/长短轮询 长短连接/长短轮询
短轮询定义:就是普通的轮询,指在特定的时间间隔,由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。短轮询是服务器立即发送响应,无论数据是否有效。 应用场景:传统的web通信,后台处理数据需要一定的时间,前端想要知
2019-06-05
下一篇 
数组常用方法 数组常用方法
Array.isArray(对象)判断这个对象是不是一个数组 .concat(数组)返回一个拼接的新数组 .push(值)在原数组的最后面添加上这个值,返回值是新数组的长度 .unshift(值)在原数组的最前面添加上这个值,返回值是新数组
2019-05-31
  目录