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:表示连接中断。
重传机制:
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