TCP/IP协议介绍——三次握手四次挥手

TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCPIP两个协议,而是指一个由FTPSMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。

TCP/IP传输协议,即传输控制/网络协议,也叫作网络通讯协议。它是在网络的使用中的最基本的通信协议。TCP/IP传输协议对互联网中各部分进行通信的标准和方法进行了规定。并且,TCP/IP传输协议是保证网络数据信息及时、完整传输的两个重要的协议。TCP/IP传输协议是严格来说是一个四层的体系结构,应用层、传输层、网络层和数据链路层都包含其中。

TCP/IP协议在一定程度上参考了OSI的体系结构。OSI模型共有七层,从下到上分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。但是这显然是有些复杂的,所以在TCP/IP协议中,它们被简化为了四个层次。

(1)应用层、表示层、会话层三个层次提供的服务相差不是很大,所以在TCP/IP协议中,它们被合并为应用层一个层次。 应用层是TCP/IP协议的第一层,是直接为应用进程提供服务的。

(2)传输层:作为TCP/IP协议的第二层,传输层在整个TCP/IP协议中起到了中流砥柱的作用。且在传输层中,TCP和UDP也同样起到了中流砥柱的作用。

(3)网络层:在TCP/IP协议中的位于第三层。在TCP/IP协议中网络层可以进行网络连接的建立和终止以及IP地址的寻找等功能。

(4)因为数据链路层和物理层的内容相差不多,所以在TCP/IP协议中它们被归并在网络接口层一个层次里。由于网络接口层兼并了物理层数据链路层所以,网络接口层既是传输数据的物理媒介,也可以为网络层提供一条准确无误的线路。

1 通信过程及相关协议

网络通信的过程中,将发出数据的主机称为源主机,接收数据的主机称为目的主机。当源主机发出数据时,数据在源主机中从上层向下层传送。源主机中的应用进程先将数据交给应用层,应用层加上必要的控制信息就成了报文流,向下传给传输层。传输层将收到的数据单元加上本层的控制信息,形成报文段、数据报,再交给网际层。网际层加上本层的控制信息,形成IP数据报,传给网络接口层。网络接口层将网际层交下来的IP数据报组装成帧,并以比特流的形式传给网络硬件(即物理层),数据就离开源主机。

在TCP/IP连接中,为了确保双方都能准备好发送和接收数据,会进行一系列的控制信号交换,这其中包括了"三次握手"来建立连接和"四次挥手"来关闭连接。三次握手和四次挥手是TCP协议中建立连接和释放连接的重要过程,它们确保了数据传输的可靠性和连接的正确管理。

TCP/IP协议中,主动发起请求的一端称为『客户端』,被动连接的一端称为『服务端』。不管是客户端还是服务端,TCP连接建立完后都能发送和接收数据。

刚开始的时候,服务器和客户端都为CLOSED状态。在通信开始前,双方都得创建各自的传输控制块(TCB)。

服务器创建完TCB后遍进入LISTEN状态,此时准备接收客户端发来的连接请求。

2 三次握手(Three-way Handshake)

三次握手用于建立TCP连接,确保发送方和接收方都准备好进行数据传输。以下是三次握手的步骤:

第一次握手

客户端向服务端发送连接请求报文段。该报文段的头部中同步SYN=1,确认ACK=0,同时选择一个初始序号seq=x。请求发送后,客户端便进入SYN-SENT状态,等待服务器确认。

SYN=1,ACK=0表示该报文段为连接请求报文

x为本次TCP通信的字节流的初始序号

SYN=1的报文段不能有数据部分,但要消耗掉一个序号

第二次握手

服务器收到连接请求的SYN报文之后,必须确认客户的SYN(SYN=1,ACK=1,ack=x+1,seq=y),同时自己也发送一个SYN包(SYN=1,seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态。

SYN=1,ACK=1表示该报文段为连接同意的应答报文

seq=y表示服务端作为发送者时,发送字节流中的第一个字节序号

ack=x+1表示服务端希望客户端发送的下一个数据报初始序号是从x+1开始

第三次握手

客户端收到服务器连接统一的应答SYN+ACK包,向服务器发送确认包(ACK=1,ack=y+1,seq=x+1,acknum=y+1),此包发送完毕,表示服务端发来的连接同意应答已经成功收到。客户端和服务器进入ESTABLISHED(代表成功打开一个TCP/IP连接,数据可以传送给用户)状态,完成三次握手。

完成三次握手,客户端与服务器开始传送数据。

3 四次挥手(Four-way Handshake)

TCP连接的释放一共需要四步,这也是四次挥手的由来。

TCP连接是双向的,在四次挥手中,前两次挥手用于断开一个方向的连接,后两次挥手用于断开另一方向的连接。确保发送方和接收方都关闭了数据传输的通道。以下是四次挥手的步骤:

第一次挥手

客户端数据发送完成,则它向服务端发送连接释放请求。该请求只有报文头,头中携带的主要参数为:FIN=1,seq=u,用来关闭客户端到服务器的数据传送。此时,客户端将进入FIN-WAIT-1状态。FIN报文段即使不携带数据,也要消耗一个序号。

FIN=1表示该报文段是一个连接释放请求

seq=u,u-1是客户端向服务端发送的最后一个字节的序号

第二次挥手

服务器收到客户端连接释放报文FIN后,发送一个ACK给客户端,报文头为:ACK=1,ack=u+1(确认序号为收到序号+1),并且带上自己的序列号seq=v。服务器进入CLOSE_WAIT状态。此时TCP连接处于半关闭状态,即客户端已经没有要发送的数据了,但服务器若发送数据,客户端仍要接受。这个状态还要持续一段时间,也就是整个CLOSE_WAIT状态持续的时间。

ACK=1:除TCP连接请求报文段以外,TCP通信过程中所有数据报的ACK都为1,表示应答

seq=v,v是服务端释放应答报文段第一个字节序号

ack=u+1表示希望收到从第u+1个字节开始的报文段,并且已经成功接收了前u个字节

客户端收到该应答后,进入FIN-WAIT-2状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。

第二次挥手完成后,客户端到服务端方向的连接已经释放,服务端不会再接收客户端的数据,客户端也没有数据要发送了。但服务端到客户端方向的连接仍然存在,服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。

第三次挥手

服务端将最后的数据发送完毕后,就向客户端发送连接释放报文FIN,用来关闭服务器到客户端的数据传送,其报文头包含:FIN=1,ack=u+1,由于在CLOS-WAIT状态,服务端很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器进入LAST_ACK状态,等待客户端的确认。

第四次挥手

客户端收到服务器的连接释放报文FIN后,向服务端发出确认应答,报文头为:ACK=1,ack=w+1,而自己的序列号是seq=u+1,客户端进入TIME_WAIT状态,接着发送一个ACK给服务器,确认后,服务器进入CLOSED状态,客户端等待一段时间后也进入了CLOSED状态。

注意,客户端最后还要等待一段时间,这就是TIME_WAIT状态。客户端等待一段时间是为了确保服务器收到了ACK,如果此时服务器没有收到ACK则可以重传。这个等待时间通常是2MSL(最长报文段寿命)的时间。当客户端撤销相应的TCB后,就进入了CLOSED状态。服务器只要收到了客户端发来的ACK报文,就撤销TCB,进入CLOSED状态。

4 总结

三次握手 :通过三次报文段的交换,客户端和服务器建立了可靠的连接,并相互确认了初始序列号。

四次挥手 :在数据传输结束后,通过四次报文段的交换,客户端和服务器正确地释放了连接,并确保了双方都已收到对方的确认信息。

序列号 :在TCP通信中,序列号用于标识每个报文段,确保数据的顺序性和完整性。

ACK和SYN标志位 :ACK标志位用于确认收到的报文段,SYN标志位用于建立连接时的同步。

TIME_WAIT状态 :客户端在关闭连接后会进入TIME_WAIT状态,等待一段时间以确保服务器收到了ACK报文段,从而避免"已失效的连接请求"问题。

相关推荐
明月看潮生几秒前
青少年编程与数学 02-003 Go语言网络编程 15课题、Go语言URL编程
开发语言·网络·青少年编程·golang·编程与数学
龙哥说跨境1 小时前
如何利用指纹浏览器爬虫绕过Cloudflare的防护?
服务器·网络·python·网络爬虫
懒大王就是我1 小时前
C语言网络编程 -- TCP/iP协议
c语言·网络·tcp/ip
Elaine2023911 小时前
06 网络编程基础
java·网络
海绵波波1072 小时前
Webserver(4.3)TCP通信实现
服务器·网络·tcp/ip
幺零九零零5 小时前
【计算机网络】TCP协议面试常考(一)
服务器·tcp/ip·计算机网络
热爱跑步的恒川5 小时前
【论文复现】基于图卷积网络的轻量化推荐模型
网络·人工智能·开源·aigc·ai编程
云飞云共享云桌面6 小时前
8位机械工程师如何共享一台图形工作站算力?
linux·服务器·网络
音徽编程8 小时前
Rust异步运行时框架tokio保姆级教程
开发语言·网络·rust
幺零九零零10 小时前
【C++】socket套接字编程
linux·服务器·网络·c++