看了网上描述的TCP协议三次握手的文章,总觉得理解起来不是很透彻。对应ACK,ack,SYN,sqe的作用和取值也理解的不是很完全。感觉事情隔着一层纸,没能完整的理解这个机制。
想起使用抓包的方式看看TCP具体的握手过程,于是安装了Wireshark。有了理论学习,在结合实例,就像能够在代码里边打断点,看变量值一样,就更容易理解了。
先说说几点要注意的地方。
1、大写的SYN和ACK是标志位,代表这个消息要达成的目的。他们和sqe、ack是不同的两类信息。SYN是Synchronization的缩写,含义为同步。也就是要求接受SYN消息的一方将ack值,和SYN消息发送放的sqe值进行同步。简单来说,就是请用我的sqe值来设置你的ack值。
2、客户端和服务器是各自保存自己的sqe值,并用ack来确认数据的接受是否成功。之前我没理解服务器和客户端各自维护自己的sqe值,给我理解握手机制,造成了一些困扰。
以下是Wireshark抓包的数据
首先是第一次握手,由客户端对服务器发起。这里客户端是192.168.0.100,服务器是185.225.12.31。客户端发出SYN的消息,同时带上自己的sqe值。
服务器收到SYN(同步)消息,根据客户端发来的sqe值,设置ack值。
在上图中看到,客户端发送的sequence number的值是0。这个值后边的括号
(relative sequence number)
说明这个是一个相对值。Wireshark为了方便我们阅读报文帮我们进行了处理,显示为0。真实的sequence number是7c fd ae ed,这是个一个16进制的数字,在下方的报文中可以看到。将这个数字加1获得ack值,ack值将在第二次握手中返回给客户端。
第二次握手,由服务器端向客户端发起。发出ACK消息对客户端发起的SYN消息进行确认。同时向客户端发出SYN消息,并带上自己的sqe值。
第二次握手
第二次我手有两个作用
1、对第一次握手的同步消息进行确认
对同步消息的确认,具体表现为,在发给客户端的报文中,将ACK标志设为1,并回传ack值。客户端可以根据ack的值判断服务器是否成功接收到了请求。
服务器发起ACK消息的时候,会带上ack值,作为对客户端SYN消息的确认。在上图下方的绿色框中,可以看到。ack值为7c fd ae ee,这个值刚好是,第一次握手时,客户端穿过来的sqe:7c fd ae ed 加上1获得的。
2、向客户端发出同步消息
发出同步消息具体的方式是将SYN标志位设为1,并发送自己的sqe值。上图中,sqe的相对值为0,真实的值为4a a1 97 47。
客户端收到服务器发来的第二次握手的消息,通过ack值,确认服务器已经接受了SYN的请求。同时收到服务器发来的SYN请求,收到SYN请求之后,根据服务器发送的sqe值,对ack进行赋值,然后,发出出第三次握手,响应服务器的SYN请求。
第三次握手,由客户端向服务器发起。发出ACK消息,对服务器发来的SYN消息进行确认。
第三次握手
第三次握手的做作用就是对第二次握手中,服务器发送的SYN同步消息进行确认。具体的做法是将ACK标志位设为1,并发送ack值。ack值,由服务器在第二次握手中发送的sqe值加1获得。这里可以看到,客户端在第三次握手中发出的ack值为4a a1 97 48 刚好是第二次握手中服务器发送的sqe值,4a a1 97 47加1获得的。
经过三次握手之后TCP连接就建立起来了,客户端和服务器之间就可以开始发送数据了。
将这个过程简化描述
1、服务器和客户端未建立连接时,服务器和客户端有各自的状态,且没有关联。
1.jpg
2、客户端发起第一次握手,标志位SYN=1,sqe值为客户端的一个值x。
2.jpg
3、服务器收到SYN信息之后,将ack的值,设为客户端sqe值+1。
3.jpg
4、第二次握手,因为收到客户端发送的SYN所以需要进行确认,同时发送自己的SYN请求。
4.jpg
5、客户端收到服务器返回的ack,根据自己的sqe+1对ack进行验证,确认服务器端确实收到了自己的SYN消息并做出了正确的回应。收到服务器的SYN消息之后,根据服务器发送的sqe值,设置自己的ack值为服务器sqe值+1。
5.jpg
6、客户端发起第三次握手对服务器的SYN进行回应,发送ACK=1,ack为y+1的消息给服务器作为确认。
6.jpg
7、服务器检查客户端发送的ack值等于自身的sqe+1确认客户端收到自己的消息并正确响应。连接建立成功。
7.jpg
网友评论