TCP协议

简介

  TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的、可靠的、 基于IP的传输层协议。

OSI的七层模型

  

  数据从应用层发下来,会在每一层都会加上头部信息,进行 封装,然后再发送到数据接收端。接收端收到数据会一层一层的解码,

每一层的作用和对应的协议如下:

  

三次握手四次挥手简图

三次握手(建立连接)

  第一次:建立连接时,客户端发送SYN包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

  第二次:服务器收到SYN包,向客户端返回ACK(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RCVD状态;

  第三次:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

  完成三次握手,客户端与服务器开始传送数据,也就是ESTABLISHED状态。

三次握手保证了不会建立无效的连接,从而浪费资源。 

四次挥手(断开连接)

  第一次: TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送。

  第二次:服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。

  第三次:服务器关闭客户端的连接,发送一个FIN给客户端。

  第四次:客户端发回ACK报文确认,并将确认序号设置为收到序号加1。

四次挥手过程中的状态变化:

  FIN_WAIT_1:当主动关闭连接的一方发送FIN,但没有接收到对象返回的ACK,会进入这个状态 

  FIN_WAIT_2:当主动关闭连接的一方发送FIN,接收到对象返回的ACK,会进入这个状态 

  CLOSE_WAIT:等待关闭,当接收到对方发送给自己的FIN以后,检查自己是否还有数据发送给对方,需要完成的事情是等待你去关闭连接。(被动方)

  LAST_ACK::它是被动关闭一方在发送FIN报文后,最后等待对方的ACK报 文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。(被动方)

  TIME_WAIT::表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。

  CLOSED:表示连接中断。

为什么要三次握手而四次回收

  之所以绝大数时候我们看到的都是四次挥手,是因为收到fin后,知道对方要关闭了,然后OS通知应用层要关闭啥的,这里应用层可能需要做些准备工作,有一些延时,所以先回ack,准备好了再发fin 。 握手过程没有这个准备过程所以可以立即发送syn+ack。

重传机制:

  TCP协议要求在发送端每发送一个报文段,就启动一个定时器并等待确认信息;接收端成功接收新数据后返回确认信息。若在定时器超时前数据未能被确认,TCP就认为报文段中的数据已丢失或损坏,需要对报文段中的数据重新组织和重传。重传一定量次数以后如果依然失败,会结束连接。

2MSL等待状态(两个作用)

  MSL:报文的最大存活时间

  第一个作用:当TCP执行一个主动关闭,并发回最后一个ACK,该链接必须在TIME_WAIT状态停留的时间为2MSL。这样可让TCP有机会在此发送最后一个ACK以防这个ACK丢失

  第二个作用:这是说在2MSL时间内,虽然可以重新启动服务器,但是这个服务器还是要平静等待MSL时间才能进行下一次连接,这样可以避免端口冲突

半开状态:

  一方已经关闭或异常终止连接而另一方却不知道,如果这个时候连接发送数据,将会返回RST,这种状态可以通过保活措施来检测出来(keepalive)

半关状态:

  TCP连接一端在结束它的发送后还能接收来自另一端数据的能力,即数据只能单向流动,程序调用的是shutdown,而不是close。

保活(keepalive):

  作用:探测连接的对端是否存活,避免因为只有一段连接存在而一段关闭的状态存在浪费资源,还可以避免中间设备因为连接长时间不用而删除连接,导致出错。

  步骤:在连接的指定时间内无数据交换,则会进行保活探测,服务端发送保活报文,若对方正确返回报文则会重置保活定时器的时间,若没有接收到正确的回应,则会根据指定的间隔继续发送探测报文,知道发送到达指定次数后,就会断开连接。

长连接短连接:

  短连接在数据包发送完成后就会自己断开。

  长连接在发包完毕后,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接,长连接会通过keepalive来探测另一端的状态

  长连接需要在http的头部设定 : Connection: Keep-alive  , 短连接为 : Connection: close

  TCP的keepalive和HTTP的Keepalive不同,一个是检测机制,一个为标识是否为长连接。

参考文章:http://network.51cto.com/art/201411/456783.htm

原文地址:https://www.cnblogs.com/liyuhui-Z/p/7736013.html