高级TCP/IP编程总结

1、基于连接和无连接协议之间的差异

(1)IP层提高了一种高效,不可靠,无连接的服务。TCP和UDP都是基于IP层工作的,那么TCP是如何保证提供一个可靠有连接的呢?TCP基于IP增加了三个服务:

第一,TCP提供了校验位,TCP的校验位是强制性字段,基本能保证数据在网络上不会被破坏,实际上UDP(非强制)和IP层(只计算IP头部)都有校验位,链路层以太网还有 CRC32 校验。IP header 和 TCP header 的 check sum 是一种非常弱的 16-bit check sum 算法,把数据当成反码表示的 16-bit integers,再加到一起。这种 checksum 算法能检出一些简单的错误,而对某些错误无能为力,由于是简单的加法,遇到“和”不变的情况就无法检查出错误(比如交换两个 16-bit 整数,加法满足交换律,结果不变)。以太网的 CRC32 比较强,但它只能保证同一个网段上的通信不会出错(两台机器的网线插到同一个交换机上,这时候以太网的 CRC 是有用的)。

第二,TCP为每包数据分配一个序列号,如果数据不按顺序到达目的地,那么接收者会重新对他进行组合。

第三,TCP提供了一个确认重传的机制,保证每一段数据都会被递交到目的地。

2、TCP不是轮询,不给应用程序提供即时的网络中断的通知。但是提供了一个keey-alive的机制用于检测死链接、撤销死链接。

3、TCP释放操作。

(1)close和shutdown有很大区别,shutdown实际上没有关闭套接字,套接字和他的资源都没有释放,当调用shutdown时影响的所有拥有此套接字的进程,而如果调用了close套接字的其他拥有者仍然可以使用它。

(2)使用shutdown关闭写时可以保证对方收到一个EOF字符不管其他进程是否打开了此套接字,而close则不一定(需要等到引用计数为0时才会发送FIN)。

(3)对UDP也可以使用shutdown,但是由于UDP不需要四次分手所以以参数关闭写来调用UDP的套接字都是有问题的,以关闭读的方式来调用shutdown可以用了防止在一个特定的端口接收数据报。

(4)当TCP从对方接收到一个FIN消息时,会通过返回值为0给读操作来通知应用程序,所以如果套接字是阻塞的,读操作立即返回且返回值为0时,可以考虑是对方已经关闭套接字。另外当涉及到select时需要注意此时会返回一个可读操作事件,需要防止读操作和select之间连续的循环。

4、尽量用大型写操作代替多个小规模的写操作,如果网络中存在未确认的数据那么TCP将不会发送新的数据,Nagle算法通过这种方法防止网络中出现多个未确认的数据段,防止出现网络拥塞。而延迟ACK机制也是减少网络中的传输的段的数量,但是这两种算法会互相影响,例如当服务器接收到第一部分数据时不能马上回复ACK(启动延迟ACK算法),而客户端启用了Nagle算法,在服务器没有确认第一部分数据前不会发送接下来的数据,所以结果就是服务器延迟ACK超时发送ACK,这样整个服务的响应速度就会大大降低。这种情况可以禁用Nagle算法,但是更好的方式是用大型写操作代替多个小规模的写操作。使用writev,可以指定一系列的缓冲区,收集要写的数据,使可以安排数据保存在多个缓冲区中,然后同时写出去,从而避免出现Nagle和延迟ACK算法的相互影响。

5、使用已连接的UDP套接字,即对UDP套接字使用connect函数有两个好处,(1)获得更高的效率(2)可以接收到某些有关UDP数据报的错误消息,例如ICMP数据不可达。

6、TCP的性能和他的接收缓冲区和发送缓冲区有很大的关系。发送和接收缓冲区应该至少为带宽延迟乘积,但是实际上很难知道带宽延迟乘积是多少。一般我们应当让发送缓冲区至少3倍于MSS的大小。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值