了解TCP的协议可以在很大程度上帮助我们分析服务器当前的TCP连接状态,同时也是排查一些网络故障的基础,首先来看一下TCP协议的三次握手与四次断开。
 
TCP协议三次握手
 
 
  1.客户端首先发起连接,也就是第一次握手,处于SYN_SENT状态。
 
  2.服务器端收到SYS 数包,立即发送ACK 应答,并发送自己的SYN(第二次握手);状态被置为SYN_RECEIVED。
 
  3.客户端接收到服务器端的应答,将自己置于ESTABLISHED,表示已经准备就绪,同时发出ACK 应答(第三次握手)。
 
  4.服务器端接收到应答,立即将自己置于ESTABLISHED 状态,开始发送数据。
 
数据传输keepalive
 
  中间的这段时间可以称之为连接保持阶段,既服务器端与数据段正在传输数据。
 
TCP协议四次挥手
 
 
   1.客户端接收完数据后,发送FIN,同时将自己置于FIN_WAIT_1 状态,等待服务器端的应答。
 
  2.服务器端收到关闭请求,将自己置于CLOSE_WAIT,等待本地用户(进程)的关闭命令。同时发送应答告诉客户端可以关闭,并且自己也向客户端请求关闭,发出后将自己从CLOSE_WAIT 变迁到LAST_ACK 状态,等待客户端应答后由本地用户(进程)执行关闭操作。
 
  3.客户端在接到服务的应答后,将自己的状态置于FIN_WAIT_2,等到服务器段发出FIN( 关闭请求), 当接收到服务器端发来的FIN 之后, 将自己置于TIME_WAIT(因为是客户端发起的关闭所以是TIME_WAIT,如果是服务器端发起的关闭,那么我们看到的将是CLOSE_WAIT。CLOSE_WAIT 是我们在浏览网页时经常看到的状态,因为网页传输完成后通常由服务器发起关闭命令),等待一定的时间以确保服务器接收到应答。
 
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/IP协议是作为一名出色的网络工程师必备的技能,等有时间我也要好好温习下这门功课了,因为不管是在平时管理网络当中,还是在处理系统错误的过程中,掌握这些协议真的是很有用。
 
   原创文章首发自阿布的博客,转载请注明,本文地址: http://www.abuve.com/294.html