《深入浅出TCP之7TCP/IP不是轮询的》

7 TCP/IP不是轮询的

7.1 tcp无法将连接的丢失立即通知应用程序的原因

  1. 如果实现立即通知连接丢失的功能,可能使用某种轮询的协议不停地测试对等实体是否存在.在任何情况下,实现这种功能都是要付出代价的,需要消耗一定的网络带宽.

  2. 设计tcp/ip的基本原则之一就是端到端原则,将其应用与网络时,基本上就是指多有智能都要尽可能地靠近连接的端点,网络自身应该是相对"亚的".比如,tcp自己处理错误控制,而不依赖网络提供.在监视对等应用程序间的连接,就意味着,需要应用程序来提供这项功能.

  3. tcp/ip的设计目标:出现网络故障时,具有维护通信的能力.通常,网络故障只是暂时的,有时路由器会为连接找到另一条路径.tcp允许临时的连接丢失,但通常可以在终端应用程序还没意识到的情况下处理好这些网络中断

7.2 保持活跃

TCP也提供了一个称作keep-alive的机制用于检测死连接,但对应用程序来说通常没什么用,如果应用程序启用keepalive机制,TCP会在连接已经空闲一段时间间隔后发送一个特殊的段给对等方。

  1. 如果对等主机可达,且对等应用程序仍在运行,对等实体的tcp就会以ACK响应.在这种情况下,tcp发送的保持活跃信号会将空闲时间重置为0,在此过程,不会通知应用程序进行了信息的交互.

  2. 如果对等主机可达,但对等应用程序没有运行,对等实体的tcp会以RST响应,tcp发送的保持活跃信号会丢弃连接并向应用程序返回一个ECONNRESET错误,这通常就是对等主机崩溃并重启的结果,如果对等应用程序只是终止或崩溃,对等的tcp会发送一个FIN.

  3. 如果对等主机没有以ACK或RST响应,tcp发送的保持活跃会继续发送保持活跃探测信号,直到它认为对等实体不可达或崩溃为止.此时,它会丢弃连接并用ETIMEFOUT通知应用程序,如果路由器返回了一条ICMP主机或网络不可达错误,就会用EHOSTUNREACH或ENETUNREACH错误通知应用程序.

  4. tcp实现的活跃机制,在它开始发送保持活跃探测之前,必须有至少2小时的默认空闲时间,其次,由于来自其对等实体的ACK没有被可靠的传输,所以在放弃连接之前它必须不断的发送探测信号,4.4BSD实现在放弃连接之前会发送9次探测信号,两次之间的间隔75秒.这就意味着使用默认BSD派生实现,要经过2小时11分15秒才能发现连接已经丢失。

  5. 有些实现允许对两个时间间隔都进行修改,但基本都是系统范围内进行的,会影响到系统中所以的tcp连接.如果修改默认值,就违背了它清除长时间死亡连接的最初目标.

  6. POSIX套接字选项TCP_KEEPALIVE,这个选项允许在每条连接的基础上指定超时间隔

7.3 心跳信号

  1. 客户端与服务端交互的各种不同类型的报文都有一个用来识别报文类型分首部.
    注意,如果这里传输的是无类型的数据,而心跳使用类型报文,会导致心跳丢失,因为tcp是字节流。

  2. 为对等实体提供的数据是没有固定记录或报文概念的字节流.(使用一条独立的连接)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值