TCP原理分析

一、TCP 报文首部



端口号
      占两个字节, 将应用进程与IP网络相关联,是应用进程的地址标识。一个端口号是一个16位号码
     注意:公用端口号 属于标准服务器,由权威机构统一分配:1~1023  
                临时端口号 用户客户          从 1024~65535

序列号
      占四个字节,TCP连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节序号。

确认号
     占四个四节,是期望收到对方的下一个报文段的数据的第一个字节序号。 确认序号是上一次已成功收到数据字节序 号加1.只有ACK标志为1时,确认序号字段才有效。

数据偏移
      占4个bit,指出TCP报文段的数据起始处距离原TCP报文段的起始处有多远,用于分片。

ACK = 1时,确认号有效
ACK = 0时,确认号无效
SYN = 1时,同步比特SYN置为1,就表示这是一个连接请求或连接接受报文。
FIN  =  1时,释放连接,表示此报文段的发送端的数据已发送完毕,并要求释放一个连接。
URG  = 1时,表示紧急指针字段有效
PSH  = 1时,表示当前报文需要请求推(push)操作
RST  = 1时,置位表示复位TCP连接

窗口
  占2个字节,窗口大小是为进行流量控制所设置的。如果不进行流量控制,一旦
发送端和接收端数据发送速率存在很大差异,那么很有可能一方的接受缓
冲已经被填满,而另一端毫无所知,仍在不停发送数据,显然这种情况下
会大量丢包,重传,进而造成网络拥塞

校验和
占两个字节,每一个报文段都有一个校验和,这可以保证被传输层接受的数据的正确性。如果校验失败,则该报文段会被丢弃。接收端不进行确认,发送端待重传定时器超时时进行重传。 校验和覆盖了整个TCP报文段,包括TCP首部和TCP数据。

以上是TCP包头必须要有的字段,也称固有字段,长度为20个字节。


二.TCP的连接与终止过程





          建 立一个TCP连接,必须经历三次握手过程,其中发送第一个SYN的一端将执行主动打开,接收这个SYN并发回下一个SYN的另一端执行被动打开。



释放连接的过程




          要释放一个TCP连接,需要通过四次握手过程,这是由TCP的半关闭特性造成的,因为TCP连接时全双工的,因此,需要TCP两端要单独执行关闭。值得注意的是,主动关闭的一端在发送FIN之后,依然还能正常接收对方的数据,只是通知对方它已经没有数据需要发送了,同理,被动关闭的一端在收到FIN之后,仍然可以发送数据,直到它自身同样发出FIN之后,才停止发送数据。

各个状态说明


注:   1.TCP连接的超时问题, 完成一个TCP连接,中间涉及到一个超时的问题,大多数伯克利系统的超时时限为75s。

三 TIME_WAIT状态存在的理由

       TIME_WAIT状态也称为2MSL等待状态。每个TCP必须选择一个报文段最大生存时间(MSL)。它是任何报文段被丢弃前在网络的最长时间。 当TCP执行一个主动关闭,并发回最后一个ACK,该连接必须在TIME_WAIT状态停留的时间为2MSL。这样可以让TCP再次发送最后的ACK以避免这个ACK丢失(另一端超时并重发最后的FIN)。这种2MSL等待的另一个结果是这个TCP连接在2MSL等待期间,定义这个连接的插口不能被使用

           TCP协议在关闭连接的四次握手过程中,最终的ACK是由主动关闭连接的一端(后面统称A端)发出的,如果这个ACK丢失,对方(后面统称B端)将重发出最终的FIN,因此A端必须维护状态信息(TIME_WAIT)允许它重发最终的ACK。如果A端不维持TIME_WAIT状态,而是处于CLOSED 状态,那么A端将响应RST分节,B端收到后将此分节解释成一个错误(在java中会抛出connection reset的SocketException)。


        因而,要实现TCP全双工连接的正常终止,必须处理终止过程中四个分节任何一个分节的丢失情况,主动关闭连接的A端必须维持TIME_WAIT状态 。


          考虑一下,如果延迟或者重传段在连接关闭后到达时会发生什么呢?
   通常情况下,因为TCP仅仅丢弃该数据并响应RST消息,所以这不会造成任何问题。当RST消息到达发出延时段的主机时,因为该主机也没有记录连接的任何信息,所以它也丢弃该段。然而,如果两个相同主机之间又建立了一个具有相同端口号的新连接,那么离群的段就可能被看成是新连接的,如果离群的段中数据的任何序列号恰恰在新连接的当前接收窗口中,数据就会被重新接收,其结果就是破坏新连接。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值