码迷,mamicode.com
首页 > 系统相关 > 详细

Linux网络编程一、tcp三次握手,四次挥手

时间:2019-10-05 22:19:20      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:报文   inf   三次   tcp   ima   完成   list   时报   服务端   

一、TCP报文格式

技术图片(图片来源网络)

 

 

SYN:请求建立连接标志位

ACK:应答标志位

FIN:断开连接标志位

二、三次握手,数据传输,四次挥手

技术图片(流程图,图片来源于网络)

技术图片(tcp状态转换图,图片来源于网络)

  1、客户端向处于监听状态(LISTEN)的服务端发送请求连接的报文。此时,报文中SYN标志位为1(表明其为请求建立连接的报文),同时还会随机生成一个32位的随机序号(图中1000),请求连接的报文可以可以携带数据(图中(0)表明没有携带数据)。客户端变为SYN_SENT状态。

  2、服务器接受到客户端发来的连接请求。服务器检测SYN是否为1,如果是,服务器发送发送报文,并发起一个连接请求。报文中ACK标志位为1,SYN为1(向客户端发起连接请求),同时还会随机生成一个32位的随机序号(图中为8000)和32位的确认序号(图中为1001,1001=客户端请求连接的随机序号1000+SYN标志位为1+数据大小为0),32位的确认序号和ACK标志位为1共同表明收到了客户端的连接请求。服务端由LISTEN状态变为SYN_RCVD。

  3、客户端接收到服务端发来的报文。客户端检测ACK标志位是否为1,并且校验32位的确认序号是否正确。如果是,客户端向服务端发送确认报文。客户端由SYN_SENT状态变为ESTABLISHED状态。服务端接收到客户端发来的确认报文,检测ACK标志位是否为1,并且校验32位的确认序号是否正确。如果是,服务端由SYN_RCVD状态变为ESTABLISHED状态。至此完成三次握手。

  4、客户端向服务端发送数据(图中数据大小为20)。报文中32的序号为对方最后发送 ACK的时候携带的确认序号,此时报文中ACK标志位为1,32位的确认序号为第三次握手时向服务端发送的确认序号。

  5、服务端接收到客户端发来的数据。校验数据编号、ACK标志位和32位确认序号后。服务端向客户端发送数据(图中大小为10)。

  6、客户端接收到来自服务端的数据,校验无误后,如果有数据发送则重复4,如果没有则只向服务端发送确认报文。至此完成数据传输。

  7、客户端向服务端发送断开连接的请求,报文中FIN标志位为1(表明为请求断开连接的报文)。32序号、ACK、确认序号同前所述。客户端状态变为FIN_WAIT_1。

  8、服务端接收到客户端断开连接的请求(服务端状态变为CLOSE_WAIT),服务端发送确认报文。客户端接收到后状态变为FIN_WAIT_2。至此客户端断开了与服务端的连接,服务端没有断开和客户端的连接。此时服务端和客户端处于半关闭状态,即服务端可以向客户端发送数据(没有断开连接),客户端不可以向服务端发送数据(断开了连接)。

  9、服务端向客户端发送断开连接的请求(服务端状态变为LAST_ACK),客户端接收后状态变为TIME_WAIT。

  10、客户端向服务端发送确认报文。至此服务端断开了与客户端的连接,四次挥手完成,双方断开连接。

Linux网络编程一、tcp三次握手,四次挥手

标签:报文   inf   三次   tcp   ima   完成   list   时报   服务端   

原文地址:https://www.cnblogs.com/qiu00/p/11625787.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!