TCP/IP Illustrated I 读书笔记6 - TCP协议及其应用

1.         TCP的特性:

l         基于连接的: 通信之前先要三次握手建立连接. 这样在一定程度上就避免了目标不可达造成的数据包丢弃.

l         可靠的: TCP也不是绝对可靠的. CRC校验算法并不能保证100%的可靠性. 可靠性可以这样理解: A). TCP发送端对每一个发送出去的数据段维护一个定时器等待对方应答. 定时器超时该段需要重发. 接收端需要应答每一个数据段, 但不一定接收到一个就应答一个, 而是可以延迟, 然后应答几个数据段. 需要注意TCP不做选择性应答, 也不做无法接收应答; B) 相比UDP, TCP一定要进行头和内容的数据校验; C). UDP应用程序发送30bytes, 再发送20bytes, 可能重组后给应用层的是现实后20bytes, 再是前面的30bytes, 顺序没保证, 但是TCP接收到的字节顺序和发送时是严格相同的, 只不过给应用程序的不一定是30bytes, 20bytes这样; D). TCP会进行流控, 来避免缓存区溢出. 使用ICMP source quench没有保障.

l         流协议: 比如说应用程序先发送10bytes, 再发送20bytes, 再发送50bytes, 由于在发送端传输层会进行缓存调整, 实际到发送端网络层的不一定是10bytes, 20bytes, 50bytes, 发送端网络层再应用分段策略. 这样在接收端网络层重组后, 不一定是10 bytes, 20bytes, 50bytes, 也就是说应用层不知道数据包是10bytes, 20bytes,50bytes, 它可能接收到的是20bytes, 20bytes, 40bytes. 这样就要依赖于应用程序对数据包进行分析结构化等; 包协议与此不同, 应用程序发送80bytes, 传输层就把80bytes给网络层, 网络层应用分段策略, 在接收端重组后仍然是80bytes. 这样看包协议更适合发送小于512bytes的结构化数据.

2.         建立连接: 建立连接时, 通信两端分别在SYN中声明自己的MSS (Maximum Segment Size). 这是传输层给网络层的最大段长. 声明MSS的目的是在避免IP分段的前提下尽可能多的发送数据来增加有效数据传输率. 以太网中通常是1460 (20 bytes IP头和20bytes TCP); TCP支持半关闭(half close), 这是主动关闭方处于FIN_WAIT2状态, 被动关闭方处于CLOSE_WAIT状态, 数据仍然可从被动关闭方发往主动关闭方; 主动关闭方进入TIME_WAIT状态后, 保持2MSL (maximum segment lifetime)时间, 在此期间该socket资源无法使用. 很多OS加入了更严格的限制, 即主动关闭方在2MSL时间内本地端口也无法使用. 尽管可以指定socketSO_REUSEADDR选项绕过OS的限制, 但是TCP还是不允许在2MSL内使用该socket资源. 这是为了确保之前TCP连接产生的数据段都已经在网络上消失, 避免和后面TCP产生的数据段混淆.

3.         重新建立连接, RESET, 通常用于一方认为连接的状态不应该收到某个数据段.

4.         TCP option中可以携带MSS, window scaleTimestamp信息.

5.         在用TCP进行交互数据传输时, 由于人工输入速度的限制, 往往能观察到延迟发送的ACK, 这是为了尽量将ACK捎带在有效内容中发送.

6.         Nagle算法用于减少网络上的小包. 该算法要求一个TCP连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组。相反, TCP收集这些少量的分组,并在确认到来时以一个分组的方式发出去。该算法的优越之处在于它是自适应的:确认到达得越快,数据也就发送得越快。而在希望减少微小分组数目的低速广域网上,则会发送更少的分组. 对于实时性要求较高的服务, 可以指定socket选项TCP_NODELAY来关闭Nagle算法.

7.         TCP维护一个缓冲区缓存从IP接收到的数据并等待应用程序读取, 窗口大小通告用于告诉对端当前自己的缓冲区剩余情况. 这样对端就可以在发送时进行流量控制. 这种控制就是滑动窗口协议. 滑动窗口协议的窗口移动主要有两种:

l         窗口合拢, 即窗口左边向右边移动, 发生在发出的数据被确认时.

l         窗口张开, 即窗口右边向右边移动, 发生在对端应用程序从TCP缓存中取走数据并释放缓冲区时.

在理想状态下, 为了最大可能的利用带宽, 通告窗口的大小不应小于通道的容量capacity (bit) = bandwidth (b/s) × round-trip time (s)

8.         PUSH标识用于发送方通知接收方将所收到的数据全部提交给应用程序. 该标识的设置不需要发送方应用程序干预, 通常在发送方TCP认为应用程序已经将一次数据发送完毕或接收方TCP缓存即将耗尽时设置.

9.         慢启动用于适应网络中出现的瓶颈现象, 尽管滑动窗口能够让发送端知道接收端的接收能力, 但是对于网络中的路由器瓶颈无从知晓. 慢启动设置了拥塞窗口(初始值为1)并根据收到的ACK增加. 能够立即发送的数据段是拥塞窗口与通告窗口的最小值. 在网络无瓶颈的情况下, 拥塞窗口大小增加的速度是指数级的, 同时受到ACK数量的制约(标识了RTT), 因此能够快速适应网络. 拥塞算法用于发生分组丢失时控制数据流量, 以避免火上浇油. 分组丢失有两种提示: 超时和接收到重复的ACK. 拥塞算法维护一个慢启动门限, 当分组丢失时, 慢启动门限设置为拥塞窗口的一半, 在拥塞窗口小于启动门限时就执行慢启动(其实是快启动, 因为增速是指数级的), 大于慢启动门限就执行拥塞算法, 增速是加法级的. 这样慢启动和拥塞算法相互作用, 发送速度就是一个从小到大, 增速从指数级到加法级的自适应过程. 当然, 发送方收到一个重复ACK的时候并不马上就认为是拥塞了, 因为这可能是IP重组后的TCP segment顺序不同.

10.     URG标识用的不多, 主要是发送端应用程序需要通知接收端应用程序某些紧急数据已经被发送, 具体怎样处理依赖于接收端应用程序的实现. 注意和PUSH的区别. 除了用途之外, URG由应用程序控制, PUSH标识由TCP设置.

11.     TCP的重传定时器通常由RTT决定, 计算RTT的方法是计算平滑的RTT (A, 通过当前值和记录值加权获得)和平滑的方差(D, 通过当前的方差和记录的方差获得). 更新的办法是: RTT = A + 4D. 对于每条路由, 系统都可以记录下历史的参数值, A, D和慢启动门限, 这样就可以在下次连接时就使用这些值进行初始化. 发生重传时, TCP不一定重传引起重传的segment, 它或许已经收到了应用程序发送的更多内容, 因此可能重新打包发送一个更大的segment. 这也体现了TCP是一个流协议.

12.     TCP对于对于ICMP source quench执行慢启动, 因为这是网络对端明确要求减少数据流量. 但对于ICMP host unreachableICMP network unreachable则重新发送引起ICMP error的数据, 因为这可能只是网络中某个路由器临时故障, 路由算法会绕过这个故障路由器.

13.     持续定时器用来处理发送方收到的通告窗口为0, 增加通告窗口的ACK丢失的导致的死锁. 发送方维持一个指数退避的定时器, 不断发送数据以探测是否通告窗口增加.

14.     糊涂窗口综合症是这样一种现象, 在通告窗口为0ACK发出后, 某时刻接收方的TCP缓存被释放了一小部分, 这是通告一个小窗口给发送方, 发送方随即按照这个小窗口发送了一小段数据, 这小段数据马上又填满了接收方的TCP缓存. 这样发送方只能一直给接收方发送小段数据, 效率比较低, 避免的方法接收端只在释放了足够大的缓存后才发送通告ACK. 同时为了适应有些早期的TCP实现没有考虑糊涂窗口现象, 发送方也必须做出一些限制来避免发送较小的数据段.

15.     TCP的心跳机制通常用于服务器探查客户端是否已经崩溃或客户端不可达, 这样可以释放掉该客户端的资源. 当然这一机制也可以在应用层实现.

16.     由于光速引起的延时不可避免, 所有有时候增加带宽不一定能有效增加传输速度. 这一点在长肥管道上尤其明显. 长肥管道会引起一系列新的问题.

l         能够通告的窗口大小只有16bits, 也就是65535, 在高速网络上需要使用窗口扩大选项来增大MSS.

l         高速网络上TCP segment的序号有可能发生回绕.

17.     TCP的性能约为80%~90%.

18.     一套网络管理协议通常包括3个部分.

l         MIB, 管理信息库, 包含所有可被查询和修改的参数. (可用ASN.1进行描述)

l         SMI, 管理信息结构. 参数的结构和表示. (可用BER进行描述)

l         管理协议操作集

ASN.1与特定的ASN.1编码规则(比如BER)一起通过使用独立于计算机架构和编程语言的方法来描述数据结构.

19.     FTP使用两个连接提供服务, 一个连接服务器端口是21用于控制, 另一个是20用于数据传输.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值