image

listen 与 connect 三次握手

上文我们聊到通过listen函数实现服务器的监听客户连接功能,下面让我们探究一下listen是如何与connect交互实现TCP三次握手的。
image
如图:当客户端启动connect时,会发送一个SYN包同时进入SYN_SENT状态,LISTEN接受到包后会返回一个ACK包,同时进入SYN_REVD状态,又一次客户端向服务器反馈,服务器收到后确认,双方连接成功建立。同时将建立起的套接字装入accept队列,等待服务器接受。
listen队列大小的设置
listen当发起连接的客户端大于队列所能容纳的数量时,第一次客户发送的SYN包不会被服务器处理反馈,此时客户端处于SYN_SENT状态,一段时间后,若队列还未腾出位置,客户端connect便会反馈连接超时(不过这个等待反馈时间相当漫长,下节我们将讲到如何自定义等待时间)。

write 与 read 读写

我们通过调用write写入,read读入消息,实际上,当我们调用完成这两个I/O接口时,消息并没有马上发送。这里还涉及到与内核缓存的交互。
当我们调用write写入一条消息时,write会将消息送入内核缓存,若内核缓冲区空间不能装下或有其他错误发生则会返回错误,而当我们调用read时,会持续等待内核缓冲区直至准备好数据,最终将读入的数据返回,这就时为何read是阻塞式的原因。可以看出,write、read只是将数据送入内核缓冲区,而数据的读取和发送时间取决于操作系统内核如何执行。
image

close()四次挥手

这篇文章讲的很全

posted on 2023-04-20 00:03  Aspirants  阅读(45)  评论(0)    收藏  举报