一、Posix
Posix 全称是(Portable Operating System Interface of UNIX) ,翻译过来就是便捷式操作系统接口。它是一个IEEE标准,定义了应用程序(以及命令行 shell 和实用程序接口)与 UNIX 操作系统之间的语言接口。
tcp网络io有三个过程,介绍各个阶段使用的API
1.建立连接
2.传输数据
3.断开连接
二、相关API在TCP网络连接中的作用
socket(), bind(), listen(), send(), recv(), close(), connect()
1. socket()
int socket (int __domain, int __type, int __protocol);
建立一个socket,分配以下内容
1.文件fd,通过bitmap找到没有被占用的文件fd
2.空的tcp控制块 (tcp control block) ,tcp控制块包含接收缓存区、发送缓冲区和状态等,注意到刚创建时没有分配接收和发送缓存区。
2. bind()
int bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len);
通过fd设置它的控制块中的端口和地址
3. listen()
int listen (int __fd, int __n);
1.通过fd设将它的控制块的状态设置为LISTEN状态
2.为控制块分配 半连接队列(syn_queue)和 全连接队列(accept_queue)
3.其中第二个参数在现在是设置全连接队列的长度
4. accept()
int accept (int __fd, __SOCKADDR_ARG __addr, socklen_t *__restrict __addr_len);
1.分配一个fd
2.绑定fd和全连接队列中的tcp控制块
5. send()
ssize_t send (int __fd, const void *__buf, size_t __n, int __flags);
把数据拷贝到内核里,内核可能积累到最大传输单元(MTU)才发送
6.recv()
ssize_t recv (int __fd, void *__buf, size_t __n, int __flags);
从内核将数据拷贝到 __buf
7.close()
int close (int __fd)
关闭连接,协议栈进行四次挥手
三、断开连接特例
-
在发出FIN报文后,接收到FIN报文(即FIN比ACK报文先到)
如图 在 FIN_WAIT_1 状态接收到FIN,发送ACK并进入 CLOSING 状态,在收到ACK后进入 TIME_WAIT 状态 -
双方同时调用close()
即双方都在 FIN_WAIT_1 状态接收到对面的FIN报文进入 CLOSING 状态并发送 ACK,然后再接收到对方的ACK后都进入TIME_WAIT状态。 -
为什么服务器端会调用close呢
例如在HTTP请求中,http头部connection参数,可能设置为 close,则服务端处理完请求会主动关闭TCP连接