TCP连接的建立与终止

TCP是一种面向连接的单播协议,在发送数据之前,通信双方必须在彼此之间建立连接。虽然TCP和UDP使用相同的网络层(IPv4或IPv6),但是TCP给应用程序提供了一种与UDP完全不同的服务——面向连接(connection-oriented)、字节流传输。

TCP可靠性

TCP提供了一个字节流接口,TCP必须把一个发送应用程序的字节流转换成一组IP可以携带的分组,这被称为组包(packetization)。这些分组包含序列号,该序列号在TCP中实际代表了每个分组的第一个字节在整个数据流中的字节偏移,而不是分组号,这允许分组在传送中是可变大小的,并允许它们组合,称为重新组包(repacketization)。应用程序数据被打散成TCP认为的最佳大小的块来发送,一般使得每个报文段按照不会被分片的单个IP数据报的大小来划分,这一点与UDP不同。

TCP维持了一个强制的校验和,该校验和涉及其头部、任何相关应用程序数据和IP头部的所有字段。这是一个端到端的伪头部,它用于检测传送中引入的比特差错。如果一个带无效校验和的报文段到达,那么TCP会丢弃它。

当TCP发送一组报文段时,它通常设置一个重传计时器,等待对方的确认接收。TCP不会为每个报文段设置一个不同的重传计时器。相反,发送一个窗口的数据,它只设置一个计时器,当ACK到达时再更新超时。如果一个确认没有及时接收到,这个报文段就会被重传。

当TCP接收到连接的另一端数据时,它会发送一个确认。这个确认可能不会立即发送,而一般会延迟片刻。TCP使用的ACK是累积的,从某种意义来讲,一个指示字节号N的ACK暗示着所有直到N的字节(不包含N)已经被成功接收了。这对于ACK丢失来说带来了一定的鲁棒性——如果一个ACK丢失,很有可能后续的ACK就足以确认前面的报文段了。

TCP给应用程序提供一种双工服务——数据可向两个方向流动,两个方向互相独立。因此,连接的每个端点必须对每个方向维持数据流的一个序列号。一旦建立了一个连接,这个连接的一个方向上的包含数据流的每个TCP报文段也包含了相反方向上的报文段的一个ACK。每个报文段也包含一个窗口通告以实现相反方向上的流量控制。因此,一个完整的TCP连接是双向和对称的,数据可以在两个方向上平等地流动。

使用序列号,一个TCP接收端可丢弃重复的报文段和记录以杂乱次序到达的报文段。因为TCP是一个字节流协议(没有边界记录),所以TCP绝不会以杂乱的次序给应用程序发送数据。因此,TCP接收端可能会被迫先保持一个大序列号的数据不交给应用程序,直到缺失的小序列号的报文段(一个“洞”)被填满。

TCP头部

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值