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