Posix 中 TCP网络IO API 详解

一、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)

关闭连接,协议栈进行四次挥手

三、断开连接特例

  1. 在发出FIN报文后,接收到FIN报文(即FIN比ACK报文先到)
    如图 在 FIN_WAIT_1 状态接收到FIN,发送ACK并进入 CLOSING 状态,在收到ACK后进入 TIME_WAIT 状态

  2. 双方同时调用close()
    即双方都在 FIN_WAIT_1 状态接收到对面的FIN报文进入 CLOSING 状态并发送 ACK,然后再接收到对方的ACK后都进入TIME_WAIT状态。

  3. 为什么服务器端会调用close呢
    例如在HTTP请求中,http头部connection参数,可能设置为 close,则服务端处理完请求会主动关闭TCP连接

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值