初步认识TCP协议——可靠性和TCP头部

       TCP是可靠的协议,不支持组播和广播,可靠性是指尽可能的保证对方收到数据包,可靠性主要体现在以下方面:

       1、数据会被TCP分割成适当的大小,防止数据包的大小大于对方缓冲区的大小,导致对方丢弃数据包,TCP提供一种机制保证接收方可以重组分割的数据包。

       

       2、当TCP发送数据包时,会维持一个计数器,如果对方在给定时间内未回复确认收到信息,则会重新发送数据包,防止了丢包的出现。


       3、当TCP接收到数据包时,会回复确认收到信息,防止丢包的出现,但不会立刻回复,通常会等待一段时间。


       4、TCP的校验码会检查数据包的TCP头部和数据部分,目的是为了防止数据包在传输过程中被修改,若校验码不正确,TCP将会丢弃数据包。


       5、TCP会丢弃重复的数据包,例如:当重传定时器到期时,会重传一份相同的数据包,此时,在网络中传送的数据包会有两份是相同的,此时TCP只会接收最先接收到的数据包,其余的数据包均被丢弃。


       6、TCP提供流量控制,发送方和接收方都会有一个缓冲区,发送数据包的大小不能超过缓冲区现在的大小

 

       TCP不会翻译所传送的二进制数据,这些数据的翻译由应用层完成,TCP的头部结构为:


初步认识TCP协议——可靠性和TCP头部

    各字段的意义:

    源端口号与目的端口号:端口号是为了辨别发送方和接收方所对应的应用程序(由于一台电脑上可能运行多个引用程序,那么数据包究竟是给谁的就由端口号来确定,源端口号方便接收方回复发送方时指定接收方端口号)

    ***:用于数据包的重组。

    确认号:接收方希望下次接收的数据包的***(运用***和确认号可以丢弃重复的数据包,如果已经接受了***为10000的数据包,则确认号会增加,若再次接收到***为10000的数据包,则会丢弃(由于确认号大于***))

    六个bool型变量:

    URG:紧急指针域有效。

    ACK:确认号域有效。

    PSH:接收方应该尽可能快的将数据包交送给应用程序。

    RST:放弃本次连接。

    SYN:用于启动连接(与三次握手有关)。

    FIN:请求断开连接(与四次回收有关)。

    

    4位头部长度:用来表示TCP头部的长度,计算公式为(32*四位头部长度)/8,单位为字节。

    窗口大小:TCP的流量控制的途径,指定缓冲区的大小。

    校验码:检查头部和数据部分,强制打开,由接收方确认。

    紧急指针:URG有效才有效,为一个偏移量,指向紧急数据的最后一位。


    选项:指定一些扩展信息,最常见的就是最大字段大小(MSS),指定了报文数据部分的最大值,在连接建立过程中,每一方都有机会在SYN报文上指定自己的MSS,如果没有指定,则默认为536字节,该选项最大值为发送接口的MTU减去TCP和IP头部的固定长度,如果目的IP地址不是本地的(即网络号不同),一般MSS默认为536字节。选项部分的结构为:

初步认识TCP协议——可靠性和TCP头部

每个选项都由一个指定类型的kind字段开头,无操作字段的目的是填充TCP报文长度,使其为4的倍数(由于TCP长度计算公式为32*长度字段/8,为4的倍数)

    TCP为建立或放弃连接发送的数据包仅仅包括头部,不会包括数据。TCP是全双工的,意味着数据流动是双向的,可以由接收方到发送方,也可以反过来,TCP建立的连接是一种逻辑上的连接,在总结四次挥手与三次握手时会再次说明。