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

TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由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=1ack=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报文段,从而避免“已失效的连接请求”问题。

  • 66
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
非常好用的C#.net的TCP控件,this.vmTcpIpServer1.Collapse = false; this.vmTcpIpServer1.EnableLog = false; this.vmTcpIpServer1.IdleTime = -1; this.vmTcpIpServer1.LocalUsingIpAddr = "127.0.0.1"; this.vmTcpIpServer1.Location = new System.Drawing.Point(9, 17); this.vmTcpIpServer1.LogFilePath = "D:\\AppLog"; this.vmTcpIpServer1.MaxLogShownLines = 30; this.vmTcpIpServer1.Name = "vmTcpIpServer1"; this.vmTcpIpServer1.PackageHeader = UNYC.TcpIp.PackageHeader.None; this.vmTcpIpServer1.PackageTailer = UNYC.TcpIp.PackageTailer.None; this.vmTcpIpServer1.PortNum = 30000; this.vmTcpIpServer1.SaveToLogFile = false; this.vmTcpIpServer1.ShowTransContents = false; this.vmTcpIpServer1.Size = new System.Drawing.Size(266, 405); this.vmTcpIpServer1.TabIndex = 0; // // vmTcpIpClient1 // this.vmTcpIpClient1.AutoRecover = false; this.vmTcpIpClient1.Collapse = false; this.vmTcpIpClient1.ConnRetries = -1; this.vmTcpIpClient1.EnableLog = false; this.vmTcpIpClient1.IdleTime = -1; this.vmTcpIpClient1.IpAddr = "192.168.100.231"; this.vmTcpIpClient1.Location = new System.Drawing.Point(311, 17); this.vmTcpIpClient1.LogFilePath = "D:\\AppLog"; this.vmTcpIpClient1.MaxLogShownLines = 100; this.vmTcpIpClient1.Name = "vmTcpIpClient1"; this.vmTcpIpClient1.PackageHeader = UNYC.TcpIp.PackageHeader.None; this.vmTcpIpClient1.PackageTailer = UNYC.TcpIp.PackageTailer.None; this.vmTcpIpClient1.PingInterval = 500; this.vmTcpIpClient1.PortNum = 912815; this.vmTcpIpClient1.SaveToLogFile = false; this.vmTcpIpClient1.ShowTransContents = false; this.vmTcpIpClient1.Size = new System.Drawing.Size(266, 405);
TCP/IP协议中的三次握手四次挥手是在建立和终止TCP连接时使用的过程。 三次握手是指在建立TCP连接时,客户端和服务器之间进行的三个步骤: 1. 第一步:客户端向服务器发送一个SYN(同步)包,其中包含自己的初始序列号(ISN)。 2. 第二步:服务器收到SYN包后,回复一个SYN-ACK(同步-确认)包,其中包含确认号(ACK)和自己的初始序列号。 3. 第三步:客户端收到服务器的SYN-ACK包后,再回复一个ACK包,确认连接已建立。此时,双方可以开始进行数据传输。 这个三次握手的过程是为了确保客户端和服务器都能够正常接收和发送数据,以建立可靠的连接。 四次挥手是指在终止TCP连接时,客户端和服务器之间进行的四个步骤: 1. 第一步:当客户端想要关闭连接时,发送一个FIN(结束)包给服务器。 2. 第二步:服务器收到FIN包后,回复一个ACK包确认收到,并进入半关闭状态。此时服务器仍可以发送数据给客户端。 3. 第三步:当服务器也想要关闭连接时,发送一个FIN包给客户端。 4. 第四步:客户端收到FIN包后,回复一个ACK包确认收到。此时连接关闭。 这个四次挥手的过程是为了确保客户端和服务器都能够完成数据的传输,并安全地关闭连接。 总结起来,三次握手用于建立连接,而四次挥手用于终止连接。通过这些步骤,TCP连接可以在客户端和服务器之间建立起来,并在不需要时安全地关闭。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值