connect函数以及未决连接队列
2021/10/22 23:42:23
本文主要是介绍connect函数以及未决连接队列,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
connect函数
connect函数是用于客户端程序和服务器程序建立tcp链接的
connect函数原型
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 参数说明: sockfd:客户端的套接字文件描述符 addr:要连接的套接字地址,这是一个传入参数,指定了要连接的套接字地址信息(例如IP地址和端口号) addrlen:是一个传入参数,参数addr的大小,即sizeof(addr) 返回值说明:连接建立成功返回0,失败返回-1并设置errno
connect函数在建立tcp连接的过程中使用了未决连接队列。
未决连接队列:
服务器接存储尚未被处理的客户端连接请求(未完成连接队列 + 已完成连接队列),数量由listen函数设定的backlog参数决定。
- 未完成连接队列(半连接队列):没有完成三次握手,即客户端已经发出SYN报文并到达服务器,但是在tcp三次握手连接完成之前,服务器处于SYN_RCVD状态。(完成三次握手后,会被放入已完成连接队列的队尾)
- 已完成连接队列(全连接队列):完成tcp三次握手的tcp连接,服务器处于ESTABLISHED状态,服务器会将这些套接字加入到已完成队列。(被accept接受后,就被从队列中剔除)
connect函数中关于tcp三次握手连接建立的几种状态:
SYN_SENT,SYN_RCVD,ESTABLISHED
-
SYN_SENT:当客户端调用connect函数向服务端发送SYN包时,客户端就会进入 SYN_SENT状态,并且还会等待服务器发送第二个SYN + ACK包,因此SYN_SENT状态就是表示客户端已经发送SYN包。
-
SYN_RCVD:当服务端接收到客户端发送的SYN包并确认时,服务端就会进入 SYN_RCVD状态,这是tcp三次握手建立的一个很短暂的中间状态,一般很难看到, SYN_RCVD状态表示服务端已经确认收到客户端发送的SYN包。
-
ESTABLISHED:该状态表示tcp三次握手连接建立完成。
客户端发起connect函数请求:
- 服务器收到连接请求,然后检查未决连接队列是否有空位
- 如果未决连接队列有空位,就将该连接加入未决连接队列
- 如果未决队列满了,查看 /proc/sys/net/ipv4/tcp_abort_on_overflow参数。
cat /proc/sys/net/ipv4/tcp_abort_on_overflow 有效值为:0或1 0:当tcp建立连接的3次握手完成后,将连接置为ESTABLISHED状态并 交付给应用程序的backlog队列时,会检查backlog队列是否已满。若 已满,通常行为是将连接还原至SYN_ACK状态,以造成3次握手最后 的ACK包意外丢失的假象,这样在客户端等待超时后可重发ACK,以再 次尝试进入ESTABLISHED状态,作为一种修复、重试机制。 1:如果tcp_abort_on_overflow为1,则在检查到backlog队列已 满时,直接发RST包给客户端终止此连接。此时客户端程序会收 到104 Connection reset by peer错误。
查看队列溢出 netstat -s | grep "listen|LISTEN" SYNs to LISTEN ockets ignored 前面的数字是半连接队列的溢 出 times the listen queue of a socket overflowed 前面的 数字是全连接队列的溢出。 查看队列使用情况 ss -lnt Send-Q:全连接队列(accept queue)的最大值,其值 为min(backlog,somaxconn) Recv-Q:已建立成功(状态为ESTABLISHED),但尚未交付给应用 的“tcp连接的数量”,其最大值为Send-Q+1。(即三次握手完成,但 是服务端还没有调用accept从全连接中取出的连接数量----积压数量)
要查看队列溢出的情况,可以把 /proc/sys/net/ipv4/tcp_abort_on_overflow参数改为1。
参考以下文章:
从抓包的角度分析connect()函数的连接过程
全连接队列和半连接队列
这篇关于connect函数以及未决连接队列的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-07fastcgi 是什么-icode9专业技术文章分享
- 2024-10-07fastcgi 的详细使用教程介绍-icode9专业技术文章分享
- 2024-10-07git如何更新单个文件到本地-icode9专业技术文章分享
- 2024-10-07如何使用ASM(Abstract Syntax Tree Manipulation)技术来修改第三方AAR依赖中的函数-icode9专业技术文章分享
- 2024-10-07Activity 跳转时间耗时很长怎么优化解决-icode9专业技术文章分享
- 2024-10-07Androud Toast 有哪些常用的第三方组件-icode9专业技术文章分享
- 2024-10-07在viewmodel中怎么使用 mmkv?-icode9专业技术文章分享
- 2024-10-07MMKV.defaultMMKV() 是单例模式吗?-icode9专业技术文章分享
- 2024-10-04el-table 开启定时器下,表格的选中状态会消失是什么原因-icode9专业技术文章分享
- 2024-10-03如何安装和初始化飞牛私有云 fnOS?-icode9专业技术文章分享