《TCP/IP高效编程》 ---------阅读笔记

技巧1:理解面向连接与无连接协议之间的区别

对于无连接来说,每个分组的处理都独立于所有其他分组,而对于面向连接的协议来说,协议实现则维护了与后续分组有关的状态信息。

RTO定时器超时并不意味着原来的数据没有到达目的地,有可能是ACK丢失,或者原来的段在网络中延迟的时间太长,以至于其在ACK到达之前的RTO超时了,但这并不会造成什么问题,因为如果原来的数据确实到达了,那么重传的数据会处于接收端TCP接收窗口范围之外,会被丢弃。


技巧2TCP是一种流协议

数据是以字节流的形式传递给接收者的,没有固定的报文或者报文边界概念,从这方面来说,读取TCP数据无法预先得知再一次指定的读调用中会返回多少字节。尽管数据是以IP分组的形式传输的,但分组中的数据量与send调用中传送给TCP多少数据并没有直接关系,而且,接受程序没有什么可靠的方法可以判断数据是如何分组的,因为在两次recv调用之间可能会有多个分组到来。TCP会记录它发送了多少字节,但是不会记录这些字节是如何分组的。


技巧3TCP/IP不是轮询的

tcp无法将连接的丢失立即通知给应用程序,我们研究为什么TCP不提供这种通知机制,不这么做的优点和缺点,以及应用程序必须完成哪些工作以检测连接的丢失。

为什么不轮询,因为轮询都会消耗净荷的网络支援,并且大部分应用程序都不需要即时通知,因此不并为之付出带宽的代价。

keep-alive(保持活跃)用来检测死链接,应用程序启动保持活跃机制时,TCP会在连接空闲一段时间之后,向对等实体发送一个特殊的段,如果对等主机可达,且对等程序仍在运行,对等实体会以ACK形式相应,在这种情况下,TCP活跃机制将空闲时间重置为0。如果对等主机可达但是应用程序没有运行,则对等实体的TCP会以RST响应,TCP发送的保持活跃信号会丢弃连接并相应应用程序返回一个错误。如果对等主机没有以ACK或RST响应,TCP发送的保持活跃会继续发送保持活跃探测信号,直到它认为对等实体不可达或者崩溃为止。


技巧4:理解TCP的写操作

用户程序对一条TCP连接进行写调用时,首先会将数据从用户缓存区复制到内核中去,从此之后,可能发生的情况就与连接的状态有关了,TCP可能发送全部、部分或者不发数据。总的来说,除非TCP缓存区满了,否则写操作是不会被阻塞的,也就是说,写操作基本总是能立即返回的,但他们返回时并不能保证对所写的数据进行了哪些处理。

技巧5:理解TCP的有序释放操作


shutdown调用 :shutdown(int s, inthow)其中how0,1,2分别表示关闭接受,发送,两端。关闭套接字和shutdown之间是有很大的区别的,即使将how值设为2来使用,实际上也没有“关闭“套接字,也就是说,并没有释放套接字及其资源。同时,调用shutdown时,会影响到所有打开了那个套接字的进程。


技巧6:服务器应设置SO_REUSEADDR选项

当我们服务器崩溃之后,试图重启时,会收到错误的提示“Address already in use“,过了几分钟后才能重启服务器。

因为这时候主动停止的那一端还处于TIME-WAIT状态,并在此状态停留 了2MSL,通过设置套接字选项SO_REUSEADDR,指示TCP允许我们绑定到一个已经在使用的端口上去。

 

技巧7:如何使connect调用超时

   通常在套接字阻塞的情况下,在收到对客户端SYN的ACK之前,connect是不会返回的,如果网络阻塞,或者要连接的主机还没有启动,所需要时间可能更长,因此允许放弃connect通常是一项很有用的功能,当然TCP最终会放弃connect调用,但是默认时间(75秒)可能比我们希望等待的时间要长。

有两种方法,其一在connect前使用alarm(inttime)告警,表示希望等待的时间不超过time秒。

其二,在connect之前使用select,在select中设置时间超时。


技巧8:避免数据复制

其一,如果知道要在读取到缓冲区的数据的前面加上一个首部,在读取时就应该为其留有空间。

其二,将报文分组定义为一个结构,这个结构将数据缓冲区作为它的一个元素,然后只要将数据读入适当的结构字段中去就可以了。

其三,使用合并写操作。

使用共享内存几乎可以避免所有的数据复制,包括进程间的。


技巧9:使用前将结构sockaddr_in清零

尽管通常我们只是用sockaddr_in结构的三个字段,sin_family,sin_port和sin_addr,但在大多数实现中它还包含其他部分,因此必须在使用钱,将整个地址结构清零就成了一种惯用的做法。

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值