网络posix api
什么时posix api
不同操作的系统给用户层提供的接口提供了统一的标准,这些接口统称为posix, 例如open函数,在不同的操作系统上回调这些接口时,能保证入参和功能是一致的
相关的api
-
socket
功能:创建sockfd , 操作系统分配一个tcp 控制块
说明:
a.sockfd 的分配是依次分配的,例如3 被回收了,下次分配时3就会被分配
b. 分配之后,在对应的bitmap 上进行置1 -
bind()
功能:将五元组信息set 到fd 对应的tcp 控制块中
说明:客户端不使用bind(), 在与服务端通信过程会被随机分配一个端口号(1024-65535) -
listen()
功能:
a. 将tcb 的status 设置为listen
b. 为fd 对应的tcb 添加到syn队列(半连接队列)
说明:
-
accept()
功能:为客户端分配一个fd,以及对应的tcb
说明:
a. 从半连接队列move fd 对应的结点到全连接队列,通过比对五元组信息的方式进行查找对应的结点。 -
recv()
功能:copy fd对应的内核缓冲区到 用户层
说明: -
send()
功能:copy 用户层数据到fd 对应的内核层缓冲区, 在通过协议栈发送数据。
说明:发送的数据可能需要累计一定大小,才发送出去,例如发送数据的大小mtu的大小,等待下次的send()后内核缓冲区的填充满,协议栈在发送数据 -
close()
功能:回收socket() 创建的fd
说明:
a.服务端如何知晓客户端调用close()?
答:客户端调用close(),发送了一个FIN报文,服务端调用recv()后,检测到返回值为0
b.客户端close()之前调用send(), 两者同时组成一个报文发送,服务端怎么感知客户端调用close()?
答:协议栈会感知检测两个事件,可读事件触发,从缓冲区读取数据,FIN事件在服务端调用recv()返回0. -
connect()
功能:向服务端发送连接请求, 发送1个ACK标志位置1的报文
说明:
问:如果通信双方同时调用connect()会发生什么?
答:会出现类似于p2p情况,不存在客户端和服务端,依旧能保持通信
扩充补充:p2p
问题
- tcp的声明周期是从什么时候开始的?
从它第一次连接的时候,listen 收到包的时候,协议栈为其分配一个tcp连接 - 第三次握手数据包,如何从半连接队列查找匹配的结点?
通过五元组从syn 队列查找 - 客户建立大量的syn连接,syn 泛洪如何防范?
通过listen(int fd, int backlog), 第二个参数来backlog 来限定