Linux下C编程(4)
通常写一个跨计算机网络的通信程序时, 目前在WINDOWS和LINUX上实现TCP/IP协议簇大部分应用,这些应用有些是通过TCP/UDP/SCTP进行,有些是直接对IP层操作,还有一些能够直接进行DATALINK操作.这些操作从应用的角度来说都是使用SOCKET API系统调用,也就是说使用SOCKETAPI它实际上不仅仅可以控制TCP/UDP之上的数据,还可以控制基于DATALINK/IP之上的数据.如下图所示: 拥有帝国一切,皆有可能。欢迎访问phome.net
1)TCP的三次握手和四次挥手机制 TCP同UDP不一样,是面向连接的,具有一定的可靠性,当然这个可靠性也不是100%,但是它提供了一种机制,这种机制就是收发端要进行双向同步确认机制.如下图所示,在建立阶段,发起方或称客户端发送一SYN数据包,请求对端ACK,当中使用SEQ 数据作为校验标识,服务端在获取客户端SYN数据包的SEQ值加上1作为向客户端发出ACK标识的值,如下图中J 1,附带在服务端发出的SYN数据包中,客户端接收到这个SYN包时需要检验ACK标识,同时给服务端一个ACK数据包,这个包中的ACK值使用服务端发过来的SYN中序列值加1.如下图中K 1
在关闭阶段,
2)socket pair组成(连接的两个端点由4个值来决定,本地IP地址,本地端口,对端IP地址,对端端口),如下图所示,通常对一个TCP服务端来说,都有多个客户端,如何唯一标识这种连接呢,实际上使用的是socketpair,四个值来确定.
3)缓冲机制及数据报文大小限制.不管是TCP还UDP其依赖的都是IP数据包,不管是IPV4还是IPV6最大的值都是65535字节,这当中还包括IPV4/IPV6的头.因此在硬件层给这个报文传输单元大小设置了一个一个参数叫MTU,通常Ethernet MTU是1500bytes.当然可以通过ethtool工具进行调整.对IPV4来说,如果超过MTU值的包进来会进行拆分,记录序列号,然后在对方进行组装.对IPV6来说,有些路由器就不进行拆分,直接回错.当然这里面对Socket还有一个选项MSS可以进行设置.另外从开发的角度来说,SOCKET数据是用户空间向内核空间进行拷贝,这里TCP/UDP有一个机制是不同的.TCP还有一个内核空间缓存大小.如下图所示,可以通过SO_SNDBUF设置这个缓冲的大小.而UDP则没有,直接是数据链路层的一个固定大小. 拥有帝国一切,皆有可能。欢迎访问phome.net
4)僵尸进程(zombie process),我们知道,通常在TCPSOCKET服务端处理多个客户端连接时都会通过fork函数创建子线程来单独处理外来连接,这时会有一个问题的产生,就是当客户端连接关闭时,相应的服务端的子进程也需要关闭,如果只是简单的exit退出,实际上子线程并没有真正销毁掉.通过使用“ps aux|awk ''{print $8 " " $2 }''|grep -w Z”可以查出zombie process进程. 在TCP/IP服务端开发时,如果在服务端使用fork出子线程来处理连接socket时,需要使用在父进程中使用signal处理SIGCHLD信号量. 拥有帝国一切,皆有可能。欢迎访问phome.net |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |