详解TCP三次握手四次挥手的过程

学习网络的过程中TCP连接是非常总要的。

TCP的特点是面向连接的、可靠的字节流服务。客户端需要和服务器之间建立一个TCP连接,之后才能传输数据。数据到达之前对方就一直在等待,除非对方直接关闭连接,数据有序,先发先到。

首先TCP传送的数据单元是报文段,所以我们首先要了解一下报文段是报文首部和数据构成,而报文首部又体现这TCP的全部功能。所以先了解一下报文首部的格式:
在这里插入图片描述

如图所见,TCP报文段首部是32位的。下面介绍一下这些报文首部的具体含义:
源端口:是指发送方的端口号
目的端口:向哪一个端口发送,是交付的时候使用的;
序号:TCP传送的字节流每一个都按顺序编号
确认号:是表示自己希望收到发送方下一次发送的报文段第一个字节的序号;常用ack表示;确认号是一种捎带确认的方式;例如:服务端给客户发生ack=90;就表示90-1的报文段确认收到了,服务端希望下次发送90开头的字节的序号;
数据偏移:表示TCP报文段数据的起始位置距离Tcp报文段起始处有多远;
保留:即保留为今后使用
URG=1表示,紧急指针有效;是为了处理谨记数据需要及时发送的情况
ACK(确认):当ACK=1的时候确认号才有效
PUSH(推送):在两个进程进行交互式通信时,另一方希望自己一键之后立即得到对方相应时,可以使用这个字段;
RST(复位):当他的值为1的时候,表示出现严重差错,需要中断连接诶,重新建立连接;
SYN(同步):在连接建立的时候用来同步信号
FIN(终止):FIN=1时,用来终止一个连接;
窗口:指发送本报文段一端的接受窗口。窗口值告诉对方,本报文段从首部的确认号算起,接受方目前允许对方发送的数据量(字节为单位)。窗口是接收端和发送端都有的,以为TCP是全双工的。

校验和:用来校验数据;
紧急指针:是用来表示数据中紧急数据的字节数(紧急数据之后是普通数据,并且当URG=1时,紧急数据才有效),并且当窗口数为0的时候,紧急数据也会被发送。

以上大概讲了一下TCP报头的基本格式,
下面了解一下TCP建立连接诶的过程,即三次握手

在这里插入图片描述
第一次握手:
客户向服务器发起请求,设置报文段首部的SYN(同步)=1,seq=x(初始序号),表示请求建立连接,此时报文段并没有有效数据。
第二次握手:
服务器收到了客户发的请求消息,并给出答复,这时设置TCP报文段首部SYN(同步)=1,ACK=1(表示确认号有效),ack=x+1(确认号,表示确认收到了x号,希望下一次收到x+1的内容),seq=y(发送一个初始序号)。发送报文段给客户。
第三次握手:
客户收到了服务器发的报文段之后,会做出响应。设置报文段首部ACK=1(表示确认号有效), ack=y+1(收到了对方y,并希望下一次收到y+1内容),seq=x+1(在第二次握手中告诉客户,想要x+1,即发送)。
在这三次握手之后,TCP连接就被建成,之后就可以传输重要数据了。

问题:
一般来讲,人与人之间建立合作关系,双方都表达一次就好了。为什么这里需要三次握手呢?

原因:三次握手,是为了避免由于某些特殊原因,客户向服务器发出建立连接 的请求,但是由于特殊原因没有及时收到。当服务器有一天突然发现了这个请求,但此时客户并没有要建立连接,这是一条过时的消息。服务器以为此刻要建立连接,就发送了确认连接的请求。客户此时收到连接请求,但不需要连接,就会拒接连接。这样提高了安全性能。

接下来我们在来了解一下四次挥手(断开连接):
在这里插入图片描述
第一次挥手:
客户向服务器发送终止请求,FIN=1(终止连接),seq=u(经过一系列的数据传播,序列号可能变为n,也就是上一次发送的序列号+1);
第二次挥手:
服务器发送给客户确认收到的信息,ACK=1(确认号有效),seq=v(上一次发送的序号+1),ack=u+1(表示确认收到u的信息,下一希望收到u+1)。注意:通过前两次挥手,只是终止了客户到服务器的连接,此时服务器可以向客户发送数据,并且客户可以接收到。;
第三次挥手:
当服务器也需要断开连接时,就向客户发送终止信息(报文段)。FIN=1(终止),ACK=1(确认号有效),ack=u+1,seq=w(上一次发送的序号+1);
第四次挥手:
客户收到了服务器的请求时候,也会发送确认信息(报文段)。ACK=1(确认号有效),ack=w+1,seq=u+1(确认字段收到)。
如上图所示:客户在发送了最后一个报文段之后,并没有马上关闭。时间等待计时器为他设置等待了2MSL才关闭。MSL是一个报文段的最长寿命。这个时间结束之后,结束进程的PCB块之后,才关闭TCP连接。

为什么要等待2MSL的时间呢?
有两个理由:
1、为了让客户发送的最后一个确认信息能够被服务端接收到。

2、为了防止上面提到的“已失效的报文段”出现在本连接中。在客户最后等待的2MSL中,本连接的所有报文段都将从网络中消失。那么下一次连接就不会出现这种旧的请求。

在TCP传输数据的过程中,还有一个保活计时器。它是用来处理这种特殊现象:建立连接之后,服务器突然出现了某种故障。显然客户不能在接受到数据了,这时候,保活计时器发挥作用:他在与每个服务器进行数据传输的时候都会有记录,每次断开连接诶之后都会重新记录。如果设置两小时没有接受到信息。那么客户就会发送一个探测报文段,每个75秒发送一次,如果连续10次报文段没有被回应,那么就会主动断开连接。

注意:本文中的客户与服务器只是为了方便描述,也可以是两台主机。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值