天天看点

tcp简单传输过程分析

简单的做一下tcp传输的过程分析(linux下),以加深自己的记忆,如有不足之处,希望各位道友能够指出,谢谢!

Tcp连接传输分三步:

  1. 三步握手建立连接
  2. 数据传输
  3. 四步挥手断开连接   
    tcp简单传输过程分析

一、三步握手连接

  1. 在服务端已经完成bind listen等开启监听服务从而阻塞于accept()下(简单的情况),客户端connect()服务端:发送一个SYN数据包建立连接, 数据包IP头中包含SYN及一些常见的选项如MSS、Window size等,此时客户端:SYN_SENT;
  2. 服务端接收数据包后回应相应的ACK数据包,并在包中设置SYN位,也请求像对方建立链接,此时服务端:SYN——REVD;
  3. 客户端接收到服务端的数据包,状态:SYN_SENT---->ESTABLISHED, connect()返回,而后发送ACK回应包,表示接收到了服务端的SYN包。而后服务端接收到此包,状态:SYN_REVD--->ESTABLISHED, accept()返回,至此,连接成功建立。

二、数据传输

  1. 客户端write()发送数据,数据包ip头包含seq序号
  2. 服务段接收到这个数据包后,发送Ack把确认接收到了数据包

三、四步挥手断开链接

  1. 客户端调用close(),发送FIN包,请求结束,此时客户端:FIN_WAIT_1
  2. 服务端接受到FIN数据包时,发送一个ACK包回应表示接收到此包,客户段接收ACK包,包此时客户端:FIN_WAIT_2,服务端:CLOSE_WAIT。(注:断开链接不和三步连接一样,在发送ACK包的同时也在包中设置FIN标志,是因为当接收到客户端的FIN包时,服务端可能在读取客户段发送过来的数据)
  3. 服务端读取完数据之后,发送FIN包请求断开连接,客户端接受此包 ,此时服务端:LAST_ACK, 客户端:TIME_WAIT
  4. 客户端发送ACK包回应服务端的FIN包,服务端接收,状态:CLOSED。(注:客户端最后的TIME_WAIT状态是为了保证服务端能够接受到最后ACK包,服务端没收到ACK后,服务端重发FIN,客户端就能够重发ACK,即可靠的实现TCP双全工的终止。还可允许重复的分节在网络中消逝。)

至此TCP传输链接完成。

继续阅读