《网络编程笔记.doc》由会员分享,可在线阅读,更多相关《网络编程笔记.doc(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1. 网络模型:2. UDP3. TCP的三次握手协议(socket连接):4. 连接终止(4次)首先:主动方A调用close会导致一个tcp 发送fin分节发送给B。 (这里是tcp自动发送的,内核驱动的)。然后:B接收到fin之后给A一个ACK信号进行确认(这个ack也是内核发送的)。接下来:B应用进程收到fin之后,调用close,导致发一个fin分节给A最后:发送一个给进行确认, 5. 状态转化图:6. 对上面的time_wait状态的一个解释: 这就是为什么执行mdbbar net然后cut掉的时候,用netstat 看还是有time_wait状态的socket的原因了。 7. 解析
2、MSL。 超时重传分组。8. 套接口对:9. 缓冲区大小(Maxitum Segment Size 最大分段大小)。10. 如何发送读取数据(套接口发送缓冲区)(下面的信息很重要)11. UDP如何发送数据12. TCP/UDP小结13. 字节序:14. 端口,地址转换。15. 自实现的readn ,written 上面2个函数类似smdb中的send_all与recv_all函数。都是一个封装的函数16. socket函数AF_XXXX其中,AF表示地址族,address family17. connect函数18. bind函数19. listen函数Backuplog的意思大概为: 等待
3、队列和已完成3次握手队列的总和。 比如如果backlog=2, 那么,如果等待队列中有1个请求,已完成队列中有1个请求,如果客户端再来一个请求,则会被忽略。20. accept函数21. fork函数22. 并发服务器23. close函数24. getsocketname 和getpeername函数25. netstat显示网络状态26. RST分节UNIX网络编程中RST分节总结RST的含义为“复位”,它是TCP在某些错误情况下所发出的一种TCP分节。有三个条件可以产生RST: 1), SYN到达某端口但此端口上没有正在监听的服务器。 2), TCP想取消一个已有连接 3), TCP接收
4、了一个根本不存在的连接上的分节。1Connect 函数返回错误ECONNREFUSED:如果对客户的SYN的响应是RST,则表明该服务器主机在我们指定的端口上没有进程在等待与之连接(例如服务器进程也许没有启动),这称为硬错(hard error),客户一接收到RST,马上就返回错误ECONNREFUSED.TCP为监听套接口维护两个队列。两个队列之和不超过listen函数第二个参数backlog。当一个客户SYN到达时,若两个队列都是满的,TCP就忽略此分节,且不发送RST.这个因为:这种情况是暂时的,客户TCP将重发SYN,期望不久就能在队列中找到空闲条目。要是TCP服务器发送了一个RST,
5、客户connect函数将立即发送一个错误,强制应用进程处理这种情况,而不是让TCP正常的重传机制来处理。还有,客户区别不了这两种情况:作为SYN的响应,意为“此端口上没有服务器”的RST和意为“有服务器在此端口上但其队列满”的RST.Posix.1g允许以下两种处理方法:忽略新的SYN,或为此SYN响应一个RST.历史上,所有源自Berkeley的实现都是忽略新的SYN。2如果杀掉服务器端处理客户端的子进程,进程退出后,关闭它打开的所有文件描述符,此时,当服务器TCP接收到来自此客户端的数据时,由于先前打开的那个套接字接口的进程已终止,所以以RST响应。 经常遇到的问题: 如果不判断read
6、, write函数的返回值,就不知道服务器是否响应了RST, 此时客户端如果向接收了RST的套接口进行写操作时,内核给该进程发一个SIGPIPE信号。此信号的缺省行为就是终止进程,所以,进程必须捕获它以免不情愿地被终止。 进程不论是捕获了该信号并从其信号处理程序返回,还是不理会该信号,写操作都返回EPIPE错误。3服务器主机崩溃后重启如果服务器主机与客户端建立连接后崩溃,如果此时,客户端向服务器发送数据,而服务器已经崩溃不能响应客户端ACK,客户TCP将持续重传数据分节,试图从服务器上接收一个ACK,如果服务器一直崩溃客户端会发现服务器已经崩溃或目的地不可达,但可能需要比较长的时间; 如果服务
7、器在客户端发现崩溃前重启,服务器的TCP丢失了崩溃前的所有连接信息,所以服务器TCP对接收的客户数据分节以RST响应。27. I/O 模型:28. select函数过去,一个fd_set通常只能包含32的fd(文件描述字),因为fd_set其实只用了一个32位矢量来表示fd;现在,UNIX系统通常会在头文件中定义常量FD_SETSIZE,它是数据类型fd_set的描述字数量,其值通常是1024,这样就能表示1024的fd。根据fd_set的位矢量实现,我们理解操作fd_set的四个宏fd_set set; FD_ZERO(&set);FD_SET(0, &set);FD_CLR(4, &set
8、);FD_ISSET(5, &set); 第一个参数maxfdl表示从0开始到maxfdl-1中间,查找状态有变化的fd。 所以maxfd1必须为三个fd中的最大fd , 然后加上1.29. shutdown函数:RWWR参数与close的区别是:close会判断链接数,如果连接数大于1, 则不会close掉该链接。30. IO复用31. getsocket, setsocket函数下面这个很重要:也就是说:如果服务器端接收了一个client_fd, 为了让client_fd具有上面选项,那么就必须给服务器的监听fd设置此选项。32. 检测各种tcp条件的方法33. SO_LINGER34.
9、SO_RCVBUF, SO_SNDBUF套接口选项。即:sndbuf, rcvbuf必须在连接(connect)或监听(listen)之前就设置好。35. SO_RCVLOWAT, SO_SNDLOWAT36. SO_RCVTIMEO SO_SNDTIMEO37. SO_TYPE38. FCNTL函数虽然其他的函数比如ioctl也可以设置,但是用fcntl最理想。39. x40. x41. x42. x43. x44. x45. x46. x47. x48. x49. x50. xx51. x52. xx53. x54. xx55. x56. x57. x58. x59. x60. x61. x62. x63. x64. x65. x66. x67. x68. x69. x70. 答案开始页面为:813