TCP协议

tcp为传输控制协议的协议,位于传输层。

tcp是可靠连接,通信双方分客户端和服务端,何为可靠:

为了保证传输过程中的可靠性,TCP通过以下几种方式:

  • 连接管理
  • 校验和
  • 确认应答&序列号
  • 超时重传
  • 流量控制
  • 拥塞控制

报文结构


源端口号、目的端口号

sqe序列号

ack确认序列号,

tcp首部长度(一般为20个字节,如果还有选项的话还需要加上选项的长度),空出4字节(为了标志位共16字节对齐),6位标志位,窗口大小(建立连后,窗口大小告诉了对方我方还能接收多少字节数据),

16为校验和(是将tcp首部和数据段得到一个哈希值,防止传输过程中被改包或数据段丢失),紧急指针(一般用不上)

选项(一般用不上)

数据段(应用层的数据,也就是建立连接后tcp报文携带的真正的数据)

其中六位标志位分别代表:

 ◆URG:为1时,紧急指针有效。
 ◆ACK:为1时,确认序号有效。
 ◆PSH:为1时,接收方应该尽快将这个报文段交给应用层。
 ◆RST:为1时,重建连接。
 ◆SYN:为1时,同步程序,发起一个连接。
 ◆FIN: 为1时,发送端完成任务,释放一个连接
 

三次握手


双方建立过程成为三次握手,三次握手的目的是双方都知道自己和对方的收发都正常。

例如:(A为客户端,B为服务端,三次握手规定客户端首先发送报文)

A:B你听得到吗

B:我听到你了,你听得到我说话吗 (A发送正常,B接受正常)

A:我也听到你了,那我们开始通信了(B发送正常,A接收正常)

如下图:

三个报文分别为:

客户端首先发送一个报文,将自己生成的随机数x置为seq序列号中。

 seq = y,即服务端也生产一个序列数,该序列号标记了传输的数据,放到seq序列号中

服务端将对方发送过来的seq = x 加1,并放置到确认序列号ack中,并将ack标志位置为1,代表服务端已确认对方发送过来的报文,同时这个确认报文中携带了服务端的随机数,期望得到客户端的确认。

客户端收到该报文后,会再向服务端发送一个确认报文:

 此时客户端和服务端都已经相互确认,建立通信,可以相互收发数据

四次挥手


我们已经知道四次挥手是断开连接的操作,

例如:

A:我发送完事了,后面不会给你发送了

B:OK我知道你不会给我发消息了,但我还可以给你发消息,你也还可以接收

B:我也发送完事了,我不会给你发消息了

A:OK我知道了,那我也不接收你消息了

如下图

其中四个报文类似于三次握手,只不过中间是将FIN标志位置为1

校验和


可以将校验和理解为hash,接收方每收到一次报文都会去根据报文字节流计算校验和,再与对方发送过来的校验和进行对比。

TCP校验和覆盖TCP首部和TCP数据,而IP首部中的校验和只覆盖IP的首部,不覆盖IP数据报中的任何数据。

伪首部共有12字节,包含如下信息:源IP地址、目的IP地址、保留字节(置0)、传输层协议号(TCP是6)、TCP报文长度(报头+数据)。

伪首部是为了增加TCP校验和的检错能力:如检查TCP报文是否收错了(目的IP地址)、传输层协议是否选对了(传输层协议号)等。

计算校验和的方式

  1. 首先,把伪首部、TCP报头、TCP数据分为16位的字,如果总长度为奇数个字节,则在最后增添一个位都为0的字节。
  2. 把TCP报头中的校验和字段置为0(否则就陷入鸡生蛋还是蛋生鸡的问题)。
  3. 其次,用反码相加法累加所有的16位字(进位也要累加)。
  4. 最后,对计算结果取反,作为TCP的校验和。

序列号SEQ和确认序列号ACK


上图中TCP报文中的第3和第4两个长度为4字节的数据段分别存储了序列号和确认序列号,序列号和确认序列号是保证tcp传输有序的重要手段

序列号标记了TCP携带的body数据段,确认序列号告诉了对方我方收到的数据有哪些缺失的部分

假如有四个数据段 a b c d,从A发送给B

A 发送了a b c d,发送的报文中头部给其编号为1  2 3 4 ,但由于某种原因,c在传输过程中丢失

B每收到一个报文都会给对方回一个确认报文,于是当B再收到d时,发现序列号跟之前的对不上,则会给A回复的确认报文中,携带了C的数据段编号3,

A收到后,就会补发c数据段

此时B有两种方式处理,要么继续收 e f g,但将c的位置空出来等待,要么丢失报文段,回复RST报文复位连接。一般系统采用的都是第一种方法。

超时重传


在进行TCP传输时,由于确认应答与序列号机制,也就是说发送方发送一部分数据后,都会等待接收方发送的ACK报文,并解析ACK报文,判断数据是否传输成功。

如果A给B发送数据的时候,A没有收到B的ACK报文,那么

  1. B根本没有接收到数据
  2. B接收到了数据,但发给A的ACK丢了

超时重传机制即A会再次发送数据段,B如果是之间没收到则回复A 一个ACK,如果是之前已经收到了(通过序列号判断),则丢弃此次数据报文,但同样也会回一个ACK

在Linux中(BSD Unix和Windows下也是这样)超时以500ms为一个单位进行控制,每次判定超时重发的超时时间都是500ms的整数倍。重发一次后,仍未响应,那么等待2*500ms的时间后,再次重传。等待4*500ms的时间继续重传。以一个指数的形式增长。累计到一定的重传次数,TCP就认为网络或者对端出现异常,强制关闭连接。


 

滑动窗口 && 流量控制


所谓流量控制就是让发送发送速率不要过快,让接收方来得及接收。利用滑动窗口机制就可以实施流量控制。

原理这就是运用TCP报文段中的窗口大小字段来控制,发送方的发送窗口不可以大于接收方发回的窗口大小。

发送端每发送一个数据包,都需要得到接收端的确认应答以后,才可以发送下一个数据包。这样一来,就会在等待确认应答包环节浪费时间。为了避免这种情况,TCP引入了窗口概念。窗口大小指的是不需要等待确认应答包而可以继续发送数据包的最大值。

考虑一种特殊的情况,就是接收方若没有缓存足够使用,就会发送零窗口大小的报文,此时发送放将发送窗口设置为0,停止发送数据。之后接收方有足够的缓存,发送了非零窗口大小的报文,但是这个报文在中途丢失的,那么发送方的发送窗口就一直为零导致死锁。

解决这个问题,TCP为每一个连接设置一个持续计时器(persistence timer)。只要TCP的一方收到对方的零窗口通知,就启动该计时器,周期性的发送一个零窗口探测报文段。对方就在确认这个报文的时候给出现在的窗口大小(注意:TCP规定,即使设置为零窗口,也必须接收以下几种报文段:零窗口探测报文段、确认报文段和携带紧急数据的报文段。

窗口大小指的是可以发送数据包的最大数量。在实际使用中,它可以分为两部分。第一部分表示数据包已经发送,但未得到确认应答包;第二部分表示允许发送,但未发送的数据包。在进行数据包发送时,当发送了最大数量的数据包(窗口大小数据包),有时不会同时收到这些数据包的确认应答包,而是收到部分确认应答包。

此时窗口就通过滑动的方式,向后移动,确保下一次发送仍然可以发送窗口大小的数据包。这样的发送方式被称为滑动窗口机制。设置窗口大小为 3,滑动窗口机制原理如图所示

该部分摘自  来源icon-default.png?t=M1H3http://c.biancheng.net/view/6427.html

拥塞控制 


TCP 进行拥塞控制的过程有四个部分,分别是:慢开始(slow-start)、拥塞避免(congestion avoidance)、快重传(fast retransmit) 和 快恢复(fast recovery)(见 2009 年 9 月 公布的草案标准 RFC 5681)

慢启动(Slow-start)是用于结合其他阶段算法,来避免发送过多数据到网络中而导致网络拥塞,算法在RFC5681中定义。

慢启动初始启动时设置拥塞窗口值(cwnd)为1、2、4或10个MSS。拥塞窗口在每接收到一个确认包时增加,每个RTT内成倍增加,当然实际上并不完全是指数增长,因为接收方会延迟发送确认,通常是每接收两个分段则发送一次确认包。发送速率随着慢启动的进行而增加,直到遇到出现丢失、达到慢启动阈值(ssthresh)、或者接收方的接收窗口进行限制。如果发生丢失,则TCP推断网络出现了拥塞,会试图采取措施来降低网络负载。这些是靠具体使用的TCP拥塞算法来进行测量判断。当达到慢启动阈值(ssthresh)时,慢启动算法就会转换为线性增长的阶段,算法控制每个RTT内拥塞窗口只增加1个分段量。虽然称为“慢启动”,但实际上比拥塞控制阶段的窗口增加更为激进。

对于处理报文丢失这个事件上,不同拥塞控制算法表现有所不同:

    • TCP Tahoe

    • 对于TCP Tahoe算法,当发生丢失时,会进入“快速重传”机制,慢启动阈值设为之前拥塞窗口值的一半,拥塞窗口值降为初始值,重新进入慢启动阶段。当拥塞窗口值达到慢启动阈值时,每RTT内拥塞窗口增加值则为“MSS除以CWND”的值,所以拥塞窗口按线性速度增加。

    • TCP Reno

    • TCP Reno算法实现了一个名为“快速恢复”的机制,慢启动阈值设为之前拥塞窗口值的一半,和作为新的拥塞窗口值,并跳过慢启动阶段,直接进入拥塞控制阶段。

慢启动假设分段的未确认是由于网络拥塞造成的,虽然大部分网络的确如此,但也有其他原因,例如一些链路质量差的网络,会导致分段包丢失。在一些网络环境,例如无线网络,慢启动效率并不好。

慢启动对于一些短暂的连接性能并不好,一些较旧的网页浏览器会创建大量连续的短暂链接,通过快速开启和关闭链接来请求获得文件,这使得大多数链接处于慢启动模式,导致网页响应时间差。所以新的网页浏览器,会通过向特殊的服务器,开启一条链接来请求获得全部的文件,而避免频繁新建大量短暂链接。不过这样对一些非请求网站所提供的服务,例如广告跟踪脚本、社交分享功能脚本、网络分析脚本等,并不适用。

摘自百度百科

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值