Posix API与网络协议栈

Posix API

server: 1.socket 2.bind 3.listen 4.accept 5.recv 6.send 7.close

client: 1.socket 2.bind(optional) 3.connect 4.send 5.recv 6.close

setsockopt() getsockopt()

fd是从3开始。0.1.2已被系统占用

TCB五元组(remoteip, remoteport, localip, localport, proto);

三次握手发生在哪个函数里面?发生在协议栈里,posix api是感受不到的

客户端调用connect函数后,内核协议栈发送一个SYN=1的数据包给服务端的内核协议栈进行三次握手,服务端是一个被动的,收到第一个包后根据五元组构建出一个TCB节点。

这时候会将这个节点加入到半连接队列中(SYN队列,SYN_RECVD),之后服务器给客户端发ack包,之后客户端回发ack,服务器收到后通过五元组查找半连接队列,并将TCB放到全连接队列中

三次握手就是为了确保双向通信

服务器端口只有65535,为什么能够做到100w连接,一个fb对应一个TCB,TCB的唯一性由五元组来区分。

数据发送:send将用户态缓存数据copy到内核协议栈TCB的sendbuffer中。

                recv将内核态协议栈TCBrecvbuffer中copy到用户态缓存数据。

                而把数据发送到对端和send是两个过程是一个异步的操作。

客户端的TCB在调用socket函数的时候创建。socket创建fd和TCB。

fcntl设置fd的阻塞和非阻塞。阻塞非阻塞的设置不是对协议栈的属性的设置

因为TCP包是顺序的,所以可以采用在协议头上加长度或加上包的分隔符来解决粘包问题

保证顺序:延迟ACK

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值