TCP:传输控制协议
(面向连接的可靠传输协议 ---- 在完成了基本传输工作上,保障了传递的可靠性)
TCP的报文格式:
源端口号:TCP连接中,发起连接的主机使用的端口号
目的端口号:TCP连接中,接受连接的主机使用的端口号
序号:TCP传输的每个数据段,都有序号,作用是为了进行排序。网络中允许传输的数据长度是有限制的,数据较大时,会分成多个小数据段进行传输。而这些数据段发送到目的主机时(同时发送多个数据),无法保证是按照顺序到达目标主机。所以每个数据段,都有一个序号,来标识他们属于哪个部分,然后在目标主机中进行重新拼接。
确认序号:接收方收到一个数据段,会发送一个确认报文给发送方,来证明自己已经接到这个数据段,确认序号的作用就是告诉发送方自己接到了哪个数据段。例如:接收方收到序号为 a 的报文段,则确认序号就是 a+1 。(表示自己已经接收了 a ,下一个将接收的就是 a+1 。)
首部长度:TCP的报文首部 + 选项的字节数
ACK:只有1 bit 的标志位。如果为1,则表示这个数据段中的确认序号是有效的,即这个数据报是对之前接受到的某个报文的确认(TCP报文可同时作为确认报文和传递数据报文)
RST:只有 1 bit 的标志位。如果客户端向服务器一个端口请求建立TCP连接,服务器那个端口不允许连接(eg:没开启此端口),这时服务器会回送TCP一个报文,将RST位置写为1,让客户端不用向这个端口发起连接。
SYN:只有 1 bit 的标志位。如果为1,则说明这是一条建立的TCP报文段。
FIN:只有 1 bit 的标志位。如果为1,则说明这是一条断开的TCP报文段。
一、三次握手
TCP建立连接过程需要发送三次报文,所以TCP建立连接的过程被称为三次握手。我们假设客户端向服务器发起TCP连接。
(1)第一次握手
客户端的TCP程序首先向服务器的TCP程序发送一个TCP报文。报文不包含数据,并且它的SYN标志位置为1,表示这是一条建立连接的TCP报文段,所以这个报文段也被称为SYN报文段。客户端的TCP程序就会随机选择一个序号作为客户端报文的初始序号(假设序号为client_iwn),而后放入这个报文段的序号部分。这个报文段由运输层传递到网络层后,会被封装在一个IP数据报中发往服务器。
(2)第二次握手
包含SYN报文段的IP数据报被服务器接收后,服务器的网络层将SYN数据报抽取出来,交给运输层。同时服务器为该TCP连接分配资源(包括发送缓存、接收缓存和变量等等),并向客户端发送允许连接的TCP报文段。这条允许连接的报文段不包含数据,SYN标志位也被置为1,同时它的ACK标志位也被置为1,表示它是SYN报文段的确认报文。所以这条允许连接的报文段也被称为SYNACK报文段。服务器随机选择一个序号,作为服务器报文段的初始序号(假设称为server_iwn),并将其放入SYNACK报文段的序号部分,同时确认号字段被设置为client_iwn + 1(SYN报文段的序号+1)。这时候这个报文段可以解释为服务器向客户端说:“我已经收到了你的连接请求,我允许你连接,我的初始序号是server_iwn”。
(3)第三次握手
当客户端接收到SYNACK报文段后,它也将为TCP连接分配资源(缓存和变量),同时生成一条SYNACK报文段的确认报文,并会发送给服务器。由于经过上面两个步骤,已经算是建立了连接,所以这次的SYN标志位将被置为0,而不是1(这时候ACK标志位是1)。同时,这条报文段的序号被设置为client_iwn + 1(第一条客户报文的序号是client_iwn,而这是它的下一条,所以+1),而确认序号被设置为server_iwn + 1(第一条服务器报文的序号是server_iwn,客户端成功接收,所以期望服务器下一次发送server_iwn + 1)。和上面两条报文不同,第三条报文可以携带数据,比如HTTP的请求就是在TCP的第三次握手报文中发送到服务器的。
(图示):
二、四次断开(四次挥手)
TCP在断开连接时,客户端与服务器之间要交换四次报文。所以,TCP的断开连接也叫四次挥手。
(1)第一次挥手
由客户端进程发出断开连接指令,这会导致客户端的TCP程序创建一个特殊的TCP报文段,然后发送到服务器。这个报文段的FIN字段被置为1,表示这是一条断开连接的报文。
(2)第二次挥手
服务器接收到客户端发来的断开连接报文,然后向客户端回送这个报文的确认报文(ACK字段为1),告诉服务器已经接收到FIN报文,并且允许断开连接。
(3)第三次挥手
当服务器发送完确认报文后,服务器的TCP程序就会创建一条自己的断开连接报文,此报文的FIN字段被置为1,然后发往客户端。
(4)第四次挥手
这时客户端已经接收到服务器发来的FIN报文段,则会产生一条确认报文(ACK为1),发送给服务器,告知服务器已经接收到了它的断开报文。服务器接收到这条ACK报文段后,就会释放TCP连接相关的资源(缓存和变量),客户端等待一段时间后(半分钟、一分钟或两分钟),也灰释放处于客户端的缓存和变量。
(四次挥手,相对于建立连接来说要简单点。上面的例子是由客户端请求断开的示范,并且可以让服务器断开连接。)
(图示):
三、总结
以上是对TCP的三次握手和四次挥手做的一个相对细致的讲解,相信看完之后会有一个相对深入的理解。