Chinaunix首页 | 论坛 | 博客
  • 博客访问: 36777
  • 博文数量: 6
  • 博客积分: 174
  • 博客等级: 入伍新兵
  • 技术积分: 32
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-15 21:15
文章分类
文章存档

2015年(1)

2014年(3)

2013年(1)

2011年(1)

我的朋友

分类: 系统运维

2014-06-25 17:56:49

 最近在研究学习服务器并发性方面的相关资料,运维工程师在探讨服务器并发性时就不可避免的需要了解和掌握TCP/IP协议相关的知识。比如我们会经常使用命令netstat查看服务器并发情况时但是运维人员对tcp的返回状态了解多少,我们又是该怎样计算当前服务器并发数量?所以作为运维工程师有必要深入了解tcp相关协议的实现原理和机制。废话不说了,还是聊一聊今天的正题吧

一、TCP与服务器并发的关系

TCP是一个面向连接的协议TCP连接的建立需要三次握手,而连接的中止则需要四次握手。应用层通过TCP协议栈进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCPIP协议交互提供了套接字(Socket)接口。应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务(其实在实际应用中我们只需通过源主机的IP和端口号码区别出不同的会话)。这也就是为什么各种TCP服务器都有一个最大连接数限制的原因。

二、TCP可能存在的11种状态如下:

LISTEN:侦听来自远方的TCP端口的连接请求
SYN-SENT
:再发送连接请求后等待匹配的连接请求
SYN-RECEIVED
:再收到和发送一个连接请求后等待对方对连接请求的确认
ESTABLISHED
:代表一个打开的连接
FIN-WAIT-1
:等待远程TCP连接中断请求,或先前的连接中断请求的确认
FIN-WAIT-2
:从远程TCP等待连接中断请求
CLOSE-WAIT
:等待从本地用户发来的连接中断请求
CLOSING
:等待远程TCP对连接中断的确认
LAST-ACK
:等待原来的发向远程TCP的连接中断请求的确认
TIME-WAIT
:等待足够的时间以确保远程TCP接收到连接中断请求的确认

CLOSED:没有任何连接状态

三、TCP状态转换图:


上图描述了
TCP 11种状态的转换关系,图中的圆角矩形表示状态,箭头表示状态之间的转换。图中用粗线表示客户端主动和被动的服务器端建立连接的正常过程:客户端的状态变迁用粗实线,服务器端的状态变迁用粗虚线。细线用于不常见的序列,如复位、同时打开、同时关闭等。图中的每条状态变换线上均标有事件/动作:事件是指用户执行了系统调用( CONNECT LISTEN SEND CLOSE )、收到一个报文段( SYN FIN ACK RST )、或者是出现了超过两倍最大的分组生命期的情况;动作是指发送一个报文段( SYN FIN ACK )或什么也没有(用表示)。粗实线表示客户的正常路径;粗虚线表示服务器的正常路径;细线表示不常见的事件。每个连接均开始于 CLOSED 状态。当一方执行了被动的连接原语( LISTEN )或主动的连接原语( CONNECT )时,它便会脱离 CLOSED 状态。如果此时另一方执行了相对应的连接原语,连接便建立了,并且状态变为 ESTABLISHED 。任何一方均可以首先请求释放连接,当连接被释放后,状态又回到了 CLOSED

一)、正常状态转换介绍
   我们用上图显示正常的 TCP 连接的建立与终止过程中,客户与服务器所经历的不同状态。

  1. 服务器端首先执行 LISTEN 原语进入被动打开状态( LISTEN ),等待客户端连接;
  2. 当客户端的一个应用程序发出 CONNECT 命令后,本地的 TCP 实体为其创建一个连接记录并标记为 SYN SENT 状态,然后给服务器发送一个 SYN 报文段;
  3. 服务器收到一个 SYN 报文段,其 TCP 实体给客户端发送确认 ACK 报文段同时发送一个 SYN 信号,进入 SYN RCVD 状态;
  4. 客户端收到 SYN + ACK 报文段,其 TCP 实体给服务器端发送出三次握手的最后一个 ACK 报文段,并转换为 ESTABLISHED 状态;
  5. 服务器端收到确认的 ACK 报文段,完成了三次握手,于是也进入 ESTABLISHED 状态。

在此状态下,双方可以自由传输数据。当一个应用程序完成数据传输任务后,它需要关闭 TCP 连接。假设仍由客户端发起主动关闭连接。

1)  客户端执行 CLOSE 原语,本地的 TCP 实体发送一个 FIN 报文段并等待响应的确认(进入状态 FIN WAIT 1 );

2)  服务器收到一个 FIN 报文段,它确认客户端的请求发回一个 ACK 报文段,进入 CLOSE WAIT 状态;

3)  客户端收到确认 ACK 报文段,就转移到 FIN WAIT 2 状态,此时连接在一个方向上就断开了;

4)  服务器端应用得到通告后,也执行 CLOSE 原语关闭另一个方向的连接,其本地 TCP 实体向客户端发送一个 FIN 报文段,并进入 LAST ACK 状态,等待最后一个 ACK 确认报文段;

5)  客户端收到 FIN 报文段并确认,进入 TIMED WAIT 状态,此时双方连接均已经断开,但 TCP 要等待一个 2 倍报文段最大生存时间 MSL Maximum Segment Lifetime ),确保该连接的所有分组全部消失,以防止出现确认丢失的情况。当定时器超时后, TCP 删除该连接记录,返回到初始状态( CLOSED )。

6)  服务器收到最后一个确认 ACK 报文段,其 TCP 实体便释放该连接,并删除连接记录,返回到初始状态( CLOSED )。

二)、同时打开和同时关闭等状态

同时打开和同时关闭则是两种特殊的TCP状态,发生的概率很小在此不再赘述。如有兴趣的同学可以弄本tcp/ip原理方面的书看看!

阅读(1737) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~