Linux网络编程一tcp三次握手,四次挥手
Posted qiu00
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux网络编程一tcp三次握手,四次挥手相关的知识,希望对你有一定的参考价值。
一、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三次握手,四次挥手的主要内容,如果未能解决你的问题,请参考以下文章