zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    AT24C0X I2C通信原理
    Windows文件夹、文件源代码对比工具--WinMerge
    SignalTap导致PCIe Read/Write卡死
    Windows CMD 支持ls命令
    何为内存模型(JMM)?
    何为内存重排序?
    何为安全发布,又何为安全初始化?
    Hibernate入门之many to many关系映射详解
    Hibernate入门之one to many关系映射详解
    Hibernate入门之one to one关系映射详解
  • 原文地址:https://www.cnblogs.com/liyuhui-Z/p/7736013.html
Copyright © 2011-2022 走看看