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



0 0
原创粉丝点击