socket就是对底层网络函数的封装,底层实现了tcp/dup协议。
socket(),bind(),
创建socket时通过指定AF_INET 为ipv4, AF_INET6为ipv6;tcp协议是数据流,所以为SOCK_STREAM,而dup发送的是报文,所以格式为SOCK_DGRAM。
listen()
在内核中,每一个socket维护了两个队列,对应的就是建立连接时,服务端的两种状态:
- 接收到连接建立请求,并已回复,也就是半连接状态:sync_rcvd
- 连接已经建立:established
accept()
服务端通过调用accept方法,从已连接队列中取出一个连接,进行处理。accept会创建一个新的socket,用于处理本次连接上的所有请求。所以实际上服务端socket有两种:
- 监听socket:用于监听本机的固定ip和端口,处理连接请求,一个服务只有一个监听socket。
- 已连接socket:用于表示一个已连接的会话,处理本次会话中所有请求。一个服务会创建多个连接socket。
处理
请求的处理就是基于socket文件,就像对一个文件read和write来读写数据。![](https://img.haomeiwen.com/i14360740/3defcfd9250d3429.png)
网友评论