socket的SYN_RECV和ESTABLISHED状态
来源:互联网 发布:我的世界中国版java 编辑:程序博客网 时间:2024/05/17 06:08
1. socket的状态
1.1 状态说明
CLOSED没有使用这个套接字[netstat 无法显示closed状态] LISTEN套接字正在监听连接[调用listen后]SYN_SENT套接字正在试图主动建立连接[发送SYN后还没有收到ACK]SYN_RECEIVED正在处于连接的初始同步状态[收到对方的SYN,但还没收到自己发过去的SYN的ACK]ESTABLISHED连接已建立CLOSE_WAIT远程套接字已经关闭:正在等待关闭这个套接字[被动关闭的一方收到FIN]FIN_WAIT_1套接字已关闭,正在关闭连接[发送FIN,没有收到ACK也没有收到FIN]CLOSING套接字已关闭,远程套接字正在关闭,暂时挂起关闭确认[在FIN_WAIT_1状态下收到被动方的FIN]LAST_ACK远程套接字已关闭,正在等待本地套接字的关闭确认[被动方在CLOSE_WAIT状态下发送FIN]FIN_WAIT_2套接字已关闭,正在等待远程套接字关闭[在FIN_WAIT_1状态下收到发过去FIN对应的ACK]TIME_WAIT这个套接字已经关闭,正在等待远程套接字的关闭传送[FIN、ACK、FIN、ACK都完毕,这是主动方的最后一个状态,在过了2MSL时间后变为CLOSED状态]1.2 状态变迁图
摘自《UNIX 网络编程 卷1:套接字联网API》 P35
2. TCP的三次握手和四次挥手
2.1 总结图
左边为客户端的状态转变,后边为服务器的状态转变
2.2 说明
2.2.1 connect返回-1
errno=110(ETIMEDOUT),当服务器端网线拔了的时候,客户端发送SYN过去就会收不到ACK,因此就会出现这个错误,1分钟内就会返 回这个错误。
errno=111(ECONNREFUSED),当服务器未listen时,就会报这个错
2.2.2 ESTABLISHED不一定真的establish
会出现这种情况:client为ESTABLISHED状态而server为SYN_REVD状态。
这是因为LINUX不像其他操作系统在收到SYN为该连接立马分配一块内存空间用于存储相关的数据和结构,而是延迟到接收到client的ACK,即三次握手 真正完成后才分配空间,这是为了防范SYN flooding攻击。 如果是这种情况,那么就会出现client端未ESTABLISHED状态,server为SYN_RECV状态。
并且server的SYN_RECV状态在一定时间后会消失,client的established状态也会消失。这是因为server在SYN_RECV状态时,会像client发送多次的SYN+ACK(因为他以为自己的这个包对方没收到),发送的次数定义在/proc/sys/net/ipv4/tcp_synack_retries中,默认为5.在发送5次之后还没有收到ACK,就将其回收了,所以用netstat查看就看不到这个SYN_RECV状态了。并且会像client发送RST信号。这就会导致client的这种半连接最后也会消失。这个可以通过tcpdump抓包得到(最好知道src这样看到的包比较集中)。
- socket的SYN_RECV和ESTABLISHED状态
- 返回结果一般如下: LAST_ACK 5 (正在等待处理的请求数) SYN_RECV 30 ESTABLISHED 1597 (正常数据传输状态) FIN_WAIT1 51 FIN_WAIT2 50
- ESTABLISHED状态
- SYN_RECV状态相关
- TCP状态SYN_RECV , CLOSE_WAIT
- Socket端口状态说明 LISTENING、ESTABLISHED、TIME_WAIT及CLOSE_WAIT
- 搭建LVS负载均衡环境,出现SYN_RECV状态的处理
- Apache的工作模式和Keepalive设置导致的SYN_RECV
- SYN_RECV的意思
- SYN_RECV
- 对服务器上出现大量的SYN_RECV状态的TCP连接的问题分析
- 对服务器上出现大量的SYN_RECV状态的TCP连接的问题分析
- 服务端端口状态和客户端端口状态解释-LISTENING-ESTABLISHED-TIME_WAIT
- TCP端口状态ESTABLISHED、TIME_WAIT
- 结合linux内核源码理解SYN_RECV状态
- 结合linux内核源码理解SYN_RECV状态
- TCP端口状态说明ESTABLISHED、TIME_WAIT
- TCP端口状态说明ESTABLISHED、TIME_WAIT
- 励志:12位早起的IT大佬们让小伙伴们都惊呆了
- 无题
- Go语言-单元测试
- Acrion动态方法调用以及通配符
- Linux下QT实现自定义对话框以及设置模态和非模态对话框
- socket的SYN_RECV和ESTABLISHED状态
- [Erlang 0105] Erlang Resources 小站 2013年1月~6月资讯合集
- di
- JQuery常用代码集锦
- 初探学生信息管理系统
- matlab dir函数
- 为什么不要在头文件中写上函数定义?
- 各种ADC转换方式的优缺点
- 团购网站的销售额是怎么来的?