Linux网络编程的准备工作
1、TCP状态转换图
TCP的一些状态虽然简单,但是结合代码理解起来。还是比较麻烦的。accept运行时,开始发起三次握手,当三次握手完成是,accept成功返回。TCP断开连接的时候。有4次分手,有时候是3次。比如TIME_WAIT状态。首先断开的一方会进入TIME_WAIT状态。当主动断开放断开后,内核会发送FIN包,然后自己由原来的ESTABLISHED状态进入到FIN_WAIT_1的状态。这时被动端会回应ACK(当然还有其它情况),此时被动端进入到CLOSE_WAIT的状态。然后被动端发送FIN,主动端发送ACK。但是有时候,主动断开方发送的是FIN、ACK。被动端发送FIN、ACK,然后是一个ACK就结束掉。
2、进程与信号处理
在设计高性能的服务器程序时,最简单的方式就是采用fork函数,但是fork函数带来的僵尸进程需要自己写信号处理函数来wait。当服务器的子进程结束时,会给父进程发送SIGCHLD信号。通过对这个信号的捕捉,然后在自己的信号处理函数中来wait子进程。信号处理函数用signal来调用。
3、一些用于调试网络的命令
netstat是linux下面常用的命令之一
netstat antpl #常用,结合grep
netstat -r #查看路由
netstat -s #查看协议统计信息
tcpdump:命令行的抓包工具(图形的可以用wireshark)
tcpdump '(udp and port N) or icmp' #只显示端口为N的UDP或者icmp
tcpdump 'tcp and port 80 and tcp[13:1] & 2 != 0' #只显示80端口TCP分节中从首部开始计算偏移量为13的那个字节中的值为2.
tcpdump 'tcp and tcp[0:2] > 7000 and tpp[0:2] < 7005' #只显示源端口在7000-7005之间的
losf命令:list open file
lsof -i TCP:daytime #找出哪些进程提供daytime服务
strace:
系统调用跟踪。
strace -o log ./filename