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