tcp连接及生命周期
来源:互联网 发布:办公软件技巧大全 编辑:程序博客网 时间:2024/06/07 08:15
在高并发的环境下,除了cpu,内存等重要资源外,还有比较重要,也是经常出问题的资源-tcp连接。
这里首先就是端口的个数,因为TCP/IP协议中规定数据包的包头中端口号的长度就是16个二进制位,二进制的十六个1,换算成十进制就是65535,也就是说最多有65535个端口同时在使用。
了解tcp,首先要先了解tcp的原理及生命周期,如3次握手。
先看下图正常的tcp连接及断开过程:
1、tcp建立连接时,需要3次握手
2、tcp是双工的,因此关闭时,需要双方都调用关闭方法
3、tcp每次数据传输,都需要ack确认
在看下面的tcp抓包截图,可以反映上面的步骤。
半连接:
tcp在建立连接时,服务器端会维护两个队列,
未完成队列:成功接收客户端SYN,并ACK的客户端信息 (SYN_RECEIVED)
完成队列:成功接收客户端ACK的客户端信息 (ESTABLISHED)
这两个队列都是有系统内核来完成的,用户代码是不能干涉的,涉及的用户代码如下:
server端
绑定端口:
serverSocket = new ServerSocket(port,backlog);//java 里面backlog默认50
其中backlog用来指定完成队列的大小,实际上系统用 min(backlog, somaxconn) + 1 来最终确定的。(somaxconn == cat /proc/sys/net/core/somaxconn 默认128)
未完成队列的大小有max(64, /proc/sys/net/ipv4/tcp_max_syn_backlog 默认1024) 来指定的。
这里服务器需要防tcp_flood 攻击(SYN洪水攻击)
socket = serverSocket.accept();// 从已完成队列中取出一个连接,如果没有则等待
半关闭:
主动关闭方调用完close,但被动方还没有调用close时,称为半关闭状态,这种时候,只能接收数据,不能在发送数据了。
被动关闭方,最后的状态是closed,而主动关闭方最后是timed_wait状态,timed_wait状态需要等待2MSL才会释放,在此期间应用程序是无法再次使用同一个插口的。
优化:建议不要在服务器端主动关闭连接,以节省不必要的timed_wait状态。
参考:
http://m.blog.csdn.net/article/details?id=38700899
- tcp连接及生命周期
- TCP连接及结束过程
- TCP连接过程及状态
- TCP连接检测及处置
- TCP连接个数限制及调整方法
- TCP连接状态及表示意义
- 【计算机网络】TCP关闭连接问题及注意
- 查看tcp连接数及状态
- 关于SO_LINGER及TCP断开连接
- TCP 连接状态 及 netstat用法
- LINUX 查看tcp连接数及状态
- LINUX 查看tcp连接数及状态
- 一般的TCP的连接及创建
- 一般的TCP的连接及创建:
- TCP三次握手及释放连接详解
- Linux 监控tcp连接数及状态
- TCP 接收连接及消息的收发
- TCP异常终止连接及SO_LINGER选项
- 欢迎使用CSDN-markdown编辑器
- 如何通俗的理解java的依赖注入!
- siblings筛选同胞元素
- Oracle日期周详解以及周开始结束时间计算
- 《Motion Design for iOS》(十八)
- tcp连接及生命周期
- 旋转消消乐后端开发总结
- 依赖注入原理 Spring
- xutils使用手册(三)——IOC注入
- Charles拦截不到请求
- VS2010进行远程调试C++
- Spring MVC 项目搭建 -1- 创建项目
- Java基础知识网络编程(浏览器&服务端)
- spring 的核心框架包和XML文件配置