《TCP/IP高效编程》笔记

理解私有地址和NAT

私有地址:10.0.0.0~10.255.255.255.255        172.16.0.0~172.31.255.255.255      192.168.0.0~192.168.255.255
私有地址与因特网通信一般是NAT(网络地址翻译)
支持NAT的设备包括路由器、防火墙和独立NAT设备。大部分NAT设备支持一下三种模式:静态、地址池、PAT-端口地址转换
PAT涉及到:修改源地址、端口、ip首部校验和以及tcp段校验和(可能给哪些将于端口号有关的信息放在报文主体中传输的非标准协议带来一些问题)

TCP与UDP性能

即使程序运行在同一台机器上,udp也无法保障数据安全到达---缓冲区空间耗尽导致数据丢失
udp的性能不一定优于tcp,如多次发送数据时,tcp可能组合成一个包发送一次,而upd就会发送多次而导致性能不如tcp

认识TCP的可靠性

收到ACK并不代表对方应用程序接收到了,只是网络协议栈接收到了。
tcp的 这种简单的 校验和也不是那么可靠----忘了在哪看到的文章说 是硬件还是什么的原因导致,tcp发送的数据内容有误

理解TCP写操作

写操作很少向tcp返回错误,由于写操作会在数据被实际发送出去之前返回,通常错误都是由下一条操作返回。因为下一条操作通常都是读操作,所以通常说写操作的错误由读操作返回。

考虑用inetd来装载应用程序

考虑用tcpmux为服务器“分配"知名端口

不要暗杀TIME-WAIT连接

1.处于TIME-WAIT状态下的连接收到RST时,连接立即关闭。如主动关闭放处于TIME-WAIT状态,被动关闭端还有重复分段到达,这是主动关闭端会以ACK响应(被动FIN之后的序列)。但是被动端已经关闭了没有改连接,所以会以RST回复主动端的ACK,这时处于TIME-WAIT状态的主动端收到RST被立即关闭。虽然有些实现避免了这种误杀,但是并不是所有的
2.套接字选项SO_LINGER

如果可能使用大规模的写,而不是很多个小规模的写操作

Nagle算法与延迟ACK之间交互会造成性能下降,禁用Nagle算法,性能问题就会消失,但是网络拥塞就会加剧。所以不应该禁用Nagle算法,相反,应用程序应该将所有逻辑关联的数据一次性写入

理解如何使用connect调用超时

将监听套接字设置为非阻塞,然后用select、epoll等待它完成。
在unix下,连接建立起来时,套接字是可写的。如果出错,套接字会即可写也可读。但是当连接建立后本身有数据可读,那套接字可能是即可读也可写,就像出错了一样。我们应当调用getsockopt来从套接字解析出错状态
1.select/epoll  :
              小于0  select 出错,
              等于0 时间到 ,
              大于0 则调用 getsockopt :
2.getsockopt:
             小于0 套接字出错(自动设置errno);
            大于0 时要判断getsockopt 设置的返回参数err的值是否等于0 ,等于0 成功,不等于0 ,则err就是错误码
http://blog.csdn.net/le119126/article/details/37517453中将非则是connect时 先调用connect再用select定时,顺序有点不同,处理时代码量更大

ps:elect与阻塞和非阻塞

这2天一直和同事在讨论socket的非阻塞用在什么场合,并且认为在select时,使用的socket要设置成阻塞的,今天在网上搜了一下,才发现,原来,我们搞错了,一个套接字阻塞或者不阻塞,select就在那里,它可以针对这2种套接字使用,对任何一种套接字的轮询检测,超时时间都是有效的,区别就在于:

当select完毕,认为该套接字可读时,

1 .阻塞的套接字,会让read阻塞,直到读到所需要的所有字节;

2 .非阻塞的套接字,会让read读完fd中的数据后就返回,但如果原本你要求读10个数据,这时只读了8个数据,如果你不再次使用select来判断它是否可读,而是直接read,很可能返回EAGAIN或=EWOULDBLOCK(BSD风格) ,
     此错误由在非阻塞套接字上不能立即完成的操作返回,例如,当套接字上没有排队数据可读时调用了recv()函数。此错误不是严重错误,相应操作应该稍后重试。对于在非阻塞   SOCK_STREAM套接字上调用connect()函数来说,报告EWOULDBLOCK是正常的,因为建立一个连接必须花费一些时间。

     EWOULDBLOCK的意思是如果你不把socket设成非阻塞(即阻塞)模式时,这个读操作将阻塞,也就是说数据还未准备好(但系统知道数据来了,所以select告诉你那个socket可读)。使用非阻塞模式做I/O操作的细心的人会检查errno是不是EAGAIN、EWOULDBLOCK、EINTR,如果是就应该重读,一般是用循环。如果你不是一定要用非阻塞就不要设成这样,这就是为什么系统的默认模式是阻塞。

避免数据复制

避免数据复制,如在linux下多进程间有大量数据传递,则可以考虑共享内存+信号量
将共享内存格式化成链表或者数组,两进程间只需传递链表或者数组元素的序号

使用前将结构sockadddr_in清零

理解已连接的UDP套接字

sendto实际是一种connect调用的特例,用sendto发送数据师,内核子暂时让套接字与目的地址连接,发送数据,然后解除套接字的连接---这种连接应该是本地行为,不会产生任何网络流量,就像对udp调用connect。但是这种临时的连接、解除连接所耗费的时间大概是传输udp数据报的三分之一。所以先调用 connect 可能可以将效率提高
一般接收端不应该调用connect连接到对等实体上,如果这么做,那就只能从这个对等实体接收数据了。其他对等想与接收端连接时会收到ECONNREFUSED错误

理解缓冲区长度带来的影响

非交互式应用程序至少应该将其发送缓冲区设置为3MSS

traceroute

查询到某个目的主机的路径(ip数据包都有TTL,每经过一个路由器,TTL减一,当TTL为0时,该路由器返回一个ICMP传输超时,traceroute通过发送udp报文,每次发送的报文的TTL加1(从1开始),到达目的主机时,由于taceroute发送的目的端口一般不被监测,所有会收到目的主机返回的ICMP端口不可达

学习使用lsof

netstat只能看出有哪些端口被占用,但是并不知道是哪个进程。lsof-列出打开的文件:可查是哪个进程使用了哪个文件-套接字

学习使用netstat

1.查看活动的套接字,-f 协议 ,如  netstat -f inet 只看tcp和udp
2.查看网卡-网络接口,netstat -i 可以列出所有网卡ip、mac、ipkts-接收到的分组、opkts-发出的分组、错误、冲突
还可以与 -b 、/ 、-d 一起使用,列出输入输出的字节数,以及丢失的分组
3.查看路由 
netstat -rn 
4.协议统计 -s 选项。如果只对某个协议统计 ,-sp
如 netstat -sp udp 
-ssp 不统计结果是0的信息

学习使用系统中的调试追踪工具strace

说明--TCPIP高效编程:改善网络程序的44个技巧 PDF中文版带书签-目录 下载链接放在文档中 《TCP/IP高效编程:改善网络程序的44个技巧》是TCP/IP 领域历久弥新的经典著作,网络编程人员必备,对TCP/IP 网络编程中存在的各种问题进行了全面解析,旨在帮助读者深入透彻地理解TCP/IP 网络编程。本书组织方式比较特别,正文部分包括4 章,将网络编程中存在的常见问题组织成44 个技巧,探讨问题的过程中构建并运行了多个程序,并且指出了代码的源地址,便于读者查看。全书以技巧的形式解答了日常工作中遇到的经典问题,将本书作为手册使用,极其方便。 《TCP/IP高效编程:改善网络程序的44个技巧》主要面向有一定经验的初学者或中级网络程序员,也可作为计算机相关专业人士的参考读物。 ================ 原书名:Effective TCP/IP Programming: 44 Tips to Improve Your Network Programs 原出版社: Addison-Wesley Professional 作者: (美)Jon C. Snader 译者: 陈涓 赵振平 作译者 Jon C.Snader:TCP/IP专家,Paradigm 4的资深软件工程师。他的工作领域包括通信、网络、编译器开发、操作系统以及无线网络控制器等。最近主要从事公共安全市场的报文交换系统方面的工作。 陈涓 1997年毕业于南京通信工程学院,获得通信与信息系统方向硕士学位。留校任教至今,从事网络应用方面的工作。 赵振平 1998年毕业于南京大学计算机科学系,获得操作系统和网络方向硕士学位。目前任职于南京信风软件有限公司(www.greatbit.com),从事网络安全和多媒体方面的工作。 目录 《TCP/IP高效编程:改善网络程序的44个技巧》 第1章 概述 1 1.1 几个约定 1 1.2 本书其余部分的内容介绍 2 1.3 客户端—服务器结构 4 1.4 对基本套接字API的回顾 5 1.5 小结 12 第2章 基本概念 13 2.1 技巧1:理解面向连接和无连接协议之间的区别 13 2.2 技巧2:理解子网和CIDR的概念 18 2.2.1 分类编址 18 2.2.2 子网划分 21 2.2.3 CIDR 26 2.2.4 子网划分和CIDR的状态 27 2.2.5 小结 27 2.3 技巧3:理解私有地址和NAT 28 2.4 技巧4:开发并使用应用程序“框架” 30 2.4.1 TCP服务器框架 31 2.4.2 TCP客户端框架 36 2.4.3 UDP服务器框架 38 2.4.4 UDP客户端框架 39 2.4.5 小结 41 2.5 技巧5:套接字接口比XTI/TLI更好用 41 2.6 技巧6:记住,TCP是一种流协议 43 2.7 技巧7:不要低估TCP的性能 50 2.7.1 UDP源程序与接收程序 52 2.7.2 TCP源程序及接收程序 53 2.7.3 小结 59 2.8 技巧8:避免重新编写TCP 59 2.9 技巧9:要认识到TCP是一个可靠的,但并不绝对可靠的协议 61 2.9.1 可靠性——是什么,不是什么 61 2.9.2 故障模式 63 2.9.3 网络中断 63 2.9.4 对等实体崩溃 64 2.9.5 对等实体的主机崩溃 68 2.9.6 小结 69 2.10 技巧10:记住,TCP/IP不是轮询的 69 2.10.1 保持活跃 70 2.10.2 心跳信号 71 2.10.3 另一个例子 76 2.10.4 小结 81 2.11 技巧11:提防对等实体的不友好动作 81 2.11.1 检测客户端的终止 82 2.11.2 检测无效输入 84 2.11.3 小结 88 2.12 技巧12:成功的LAN策略不一定能推广到WAN中去 88 2.12.1 性能问题举例 88 2.12.2 隐含错误举例 89 2.12.3 小结 93 2.13 技巧13:了解协议是怎样工作的 93 2.14 技巧14:不要把OSI七层参考模型太当回事 94 2.14.1 OSI模型 95 2.14.2 TCP/IP模型 96 2.14.3 小结 98 第3章 构建高效且健壮的网络程序 99 3.1 技巧15:理解TCP的写操作 99 3.1.1 从应用程序的角度看写操作 99 3.1.2 从TCP角度看写操作 100 3.1.3 小结 103 3.2 技巧16:理解TCP的有序释放操作 103 3.2.1 shutdown调用 104 3.2.2 有序释放 106 3.2.3 小结 110 3.3 技巧17:考虑用inetd来装载应用程序 111 3.3.1 TCP服务器 111 3.3.2 UDP服务器 114 3.3.3 小结 118 3.4 技巧18:考虑用tcpmux为服务器“分配”知名端口 118 3.5 技巧19:考虑使用两条TCP连接 126 3.5.1 单连接结构 127 3.5.2 双连接架构 128 3.5.3 小结 133 3.6 技巧20:使应用程序成为事件驱动的(1) 133 3.7 技巧21:使应用程序成为事件驱动的(2) 140 3.8 技巧22:不要用TIME-WAIT暗杀来关闭一条连接 147 3.8.1 它是什么 147 3.8.2 为什么要使用它 149 3.8.3 TIME-WAIT暗杀 150 3.8.4 小结 151 3.9 技巧23:服务器应该设置SO_REUSEADDR选项 151 3.10 技巧24:可能的话,使用一个大规模的写操作,而不是多个小规模的写操作 155 3.10.1 禁用Nagle算法 158 3.10.2 将写操作合并起来 159 3.10.3 小结 161 3.11 技巧25:理解如何使connect调用超时 162 3.11.1 使用告警 162 3.11.2 使用select 164 3.11.3 小结 167 3.12 技巧26:避免数据复制 167 3.12.1 共享内存缓冲区 168 3.12.2 一个共享内存缓冲区系统 169 3.12.3 一个UNIX实现 171 3.12.4 一个Windows实现 175 3.12.5 小结 179 3.13 技巧27:使用前将结构sockadddr_in清零 179 3.14 技巧28:不要忘记字节的性别 180 3.15 技巧29:不要将IP地址或端口号硬编入应用程序中 182 3.16 技巧30:理解已连接的UDP套接字 187 3.17 技巧31:记住,并不是所有程序都是用C编写的 190 3.18 技巧32:理解缓冲区长度带来的影响 195 第4章 工具和资源 199 4.1 技巧33:熟悉ping实用工具 199 4.2 技巧34:学习使用tcpdump或类似的工具 201 4.2.1 tcpdump是如何工作的 202 4.2.2 使用tcpdump 205 4.2.3 tcpdump的输出 206 4.2.4 小结 210 4.3 技巧35:学习使用traceroute 210 4.3.1 traceroute是如何工作的 212 4.3.2 Windows TRACERT 214 4.3.3 小结 215 4.4 技巧36:学习使用ttcp 215 4.5 技巧37:学习使用lsof 219 4.6 技巧38:学习使用netstat 221 4.6.1 活动套接字 221 4.6.2 接口 223 4.6.3 路由表 223 4.6.4 协议统计 225 4.6.5 Windows版的netstat 227 4.6.6 小结 227 4.7 技巧39:学习使用系统中的调用追踪工具 227 4.7.1 过早终止 227 4.7.2 ttcp性能问题 231 4.7.3 小结 232 4.8 技巧40:构建并使用捕获ICMP报文的工具 233 4.8.1 读取ICMP报文 233 4.8.2 打印ICMP报文 234 4.8.3 小结 239 4.9 技巧41:读Stevens的书 240 4.9.1 《TCP/IP详解》丛书 240 4.9.2 《UNIX网络编程》丛书 241 4.10 技巧42:阅读代码 242 4.11 技巧43:访问RFC编辑者的页面 243 4.12 技巧44:经常访问新闻组 244 附录A 各种UNIX代码 247 附录B 各种Windows代码 250 参考书目 253 索引 257 ======================
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值