网络posix api

网络posix api

什么时posix api

不同操作的系统给用户层提供的接口提供了统一的标准,这些接口统称为posix, 例如open函数,在不同的操作系统上回调这些接口时,能保证入参和功能是一致的

相关的api

  1. socket
    功能:创建sockfd , 操作系统分配一个tcp 控制块
    说明:
    a.sockfd 的分配是依次分配的,例如3 被回收了,下次分配时3就会被分配
    b. 分配之后,在对应的bitmap 上进行置1

  2. bind()
    功能:将五元组信息set 到fd 对应的tcp 控制块中
    说明:客户端不使用bind(), 在与服务端通信过程会被随机分配一个端口号(1024-65535)

  3. listen()
    功能:
    a. 将tcb 的status 设置为listen
    b. 为fd 对应的tcb 添加到syn队列(半连接队列)
    说明:

  • 在这里插入图片描述
  1. accept()
    功能:为客户端分配一个fd,以及对应的tcb
    说明:
    a. 从半连接队列move fd 对应的结点到全连接队列,通过比对五元组信息的方式进行查找对应的结点。

  2. recv()
    功能:copy fd对应的内核缓冲区到 用户层
    说明:

  3. send()
    功能:copy 用户层数据到fd 对应的内核层缓冲区, 在通过协议栈发送数据。
    说明:发送的数据可能需要累计一定大小,才发送出去,例如发送数据的大小mtu的大小,等待下次的send()后内核缓冲区的填充满,协议栈在发送数据

  4. close()
    功能:回收socket() 创建的fd
    说明:
    a.服务端如何知晓客户端调用close()?
    答:客户端调用close(),发送了一个FIN报文,服务端调用recv()后,检测到返回值为0
    b.客户端close()之前调用send(), 两者同时组成一个报文发送,服务端怎么感知客户端调用close()?
    答:协议栈会感知检测两个事件,可读事件触发,从缓冲区读取数据,FIN事件在服务端调用recv()返回0.

  5. connect()
    功能:向服务端发送连接请求, 发送1个ACK标志位置1的报文
    说明:
    问:如果通信双方同时调用connect()会发生什么?
    答:会出现类似于p2p情况,不存在客户端和服务端,依旧能保持通信
    扩充补充:p2p

问题

  1. tcp的声明周期是从什么时候开始的?
    从它第一次连接的时候,listen 收到包的时候,协议栈为其分配一个tcp连接
  2. 第三次握手数据包,如何从半连接队列查找匹配的结点?
    通过五元组从syn 队列查找
  3. 客户建立大量的syn连接,syn 泛洪如何防范?
    通过listen(int fd, int backlog), 第二个参数来backlog 来限定
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值