文章主要保存一些网络编程的好文相关链接,为尊重作者知识产权,不作转载。持续更新中。。。
文章1对socket以及三、四次握手解释得很清晰,特别是对套接字描述符的抽象解释得很到位,比较容易给初学者或者面试补救的人提供一个清晰的模型。
文章2包含两个部分,Linux/unix IO模式,以及select、poll等IO多路复用。
IO模式这块跟《unix网络编程》上面的内容差不多,也算是一个总结。
IO模式主要分同步和异步。同步IO就包含了blocking IO,non-blocking IO,IO multiplexing。因为从逻辑上讲只要从内核拷贝数据到内存的这段时间有block发生,就属于同步IO.
- TCP 连接过程及函数
server: socket, bind, listen,accept
client: socket, connect
connect 发起三次握手,accept返回标志三次握手结束。connect不阻塞但有等待响应机制,第一次连不上,等6s再连,再等24s.通常等75秒以上返回超时。如果server端没服务,直接返回refused。
accpet阻塞等待建立连接。
bind是将众所周知端口和IP绑定到一起以便client端到server端的通信。否则通信端口将由内核分配。不管是TCP还是UDP,server端都必须bind,client只有两种情况下需要bind。
- 连接建立前就需要知道端口则bind;
- 以指定的端口进行通信则bind。
- read/write
read/write不是端对端调用,读写对象为读写缓冲区,即write不阻塞等待read准备好。相反read会阻塞等待读缓冲区可读。write的次数和read的次数也不一一对应。write向写缓冲区写,通常大小为内容大小。read向读缓冲区读,大小由自己决定。
- UDP通信
UDP不需要建立连接,所以不需要listen,也不需要accept. UDP server 可以后启动。通常这种模式
server: socket, bind, recvfrom
client: socket, (connect), sendto
由于无连接,recvfrom/sendto都包含了地址信息。所以,当对端没准备好时,也不返回出错信息。所以UDP不可靠,sendto只管发送出去,不管对端有没有准备好接收。
connect 可用可不用,UDP的connect与TCP完全不同,UDP不需要三次握手,这里的connect只是让内核记录下对端的IP和Port. 不用每次发报都建立连接,断开连接。同样的例子,对端没启来,UDP connect不会有等待响应机制,也不会返回connection refused. 程序可以继续运行。
另外,UDP可以多次调用connect,通常是在connection断开或者IP改变后。TCP只能connect一次。
UDP使用connect还有以下优点,
- 提高效率,不用每次都建立连接;
- 高并发服务中增加系统稳定性,避免端口复用;
- 可以使用read/write函数,这样如果服务端没启动,write可以返回connection refused.