TCP协议
TCP协议是什么
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793 定义。TCP应用层次是传输层。
TCP协议的特点
应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元(MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。 TCP的职责是进程到进程之间的通信。TCP保证了可靠性。 TCP的可靠性: (1)TCP尽它最大可能,将数据发送给对方 (2)即使数据没有发送给对方,TCP会给上层(进程)一个交代 (3)保证接收方接收到的数据都是有序的 (4)TCP可以保证不会接收到错误的数据 (5)根据接收能力和网络承载情况做了发送量控制
TCP协议实现机制
TCP如何实现进程到进程
数据通过互联网传输的时候不是单纯的数据,不加任何标识,如果这样数据实现不了指定进程到进程的通信。所以数据在发送的时候,需要加上特定标识,加上特定标识的过程叫做数据的封装,在数据使用的时候再去掉特定标识,去掉特定标识的过程就叫做分用。TCP的4位首部长度就是做解包用的。
TCP如何实现可靠性
TCP中有确认应答机制。确认应答机制是收到一条报文后,向发送端发送一条确认ACK,此ACK的作用就是告诉发送端:接收端已经成功的收到了消息,并且希望收到下一条报文的序列号是什么。确认序号(Acknowledgment Number)标识了报文接收端期望接收的字节序列。 校验和: 长度为16位,共2个字节。对整个TCP报文段,即TCP头部和TCP数据进行校验和计算,接收端用于对收到的数据包进行验证。
超时重传
在数据发送过程中,我们不应该有上帝视角。在进程到进程通信中。发送端发送数据后,过了很久都没有收到应答,可能有什么原因?
(1)对方完全没有收到数据 a.数据丢了 b.因为时间原因,数据还没有到达对方(因为时间过了很久,所以此项原因我们不考虑) (2)对方已收到数据,只是应答我们没有收到 a.应答丢了 b.应答因为时间原因,我们还没有收到(因为时间过了很久,所以此项原因我们不考虑)
发生以上这种情况时,我们有一个超时重传机制。 TCP的重传存在原因就是为了保障TCP的可靠性,正是由于TCP存在重传的机制,那些基于TCP的业务应用在网络交互的过程中,不再担心由于丢包、包损坏等导致的一系列应用问题了。 在发送某一个数据以后就开启一个计时器,在一定时间内如果没有得到发送的数据报的ACK报文,那么就重新发送数据,直到发送成功为止。一个报文段可以好几次的超时,也就是说,第一次发此报文段时超时了,发送端会重新发送,第二次发的时候还是超时了,此时发送端还是会重新发送,但是发送端对一个超时的报文段不会一直发,发几次之后,就会丢弃此报文段。
计时器设置的时间在好几次的发送中,为什么要变得越来越长呢?
因为在发送数据的时候,数据传输可能还没建立好,此时就重传,可能会浪费资源。
延时应答
数据传输的时候,发送端给接收端发送数据,接收端给发送端发去确认应答信息,这样比较耗时,效率低下,延迟应答就是接收端收到数据之后,稍微等一会再应答,这样可以提高数据的传输效率,因为发送端发好几次数据,接收端只需要一次来确认应答,这样可以降低网络拥塞的概率 数量限制:每隔N个包就必须应答一次 时间限制:超过最大延迟时间就必须应答一次
所有的包都可以延迟应答吗? 不是。
|