通俗易懂的讲讲TCP的三次握手

TCP协议是传输层里面的一个协议,TCP在建立连接之前进行的三次握手对于很多人来说可能一直是迷。干嘛要握三次手?握其他次数不行咩?

那么我们就来讲讲TCP的三次握手都干了些什么吧(才疏学浅,说错的地方希望大家指正)

Android 握手失败 握手功能_Android 握手失败

一、首先要明确三次握手的目的是什么?

三次握手的目的是为了确认客户端和服务端的收发功能是正常的。

那么就是需确认的东西一共有4个:

1.客户端的发送功能;
2.客户端的接收功能;
3.服务端的发送功能;
4.服务端的接收功能;

二、那三次握手分别都确认了哪些功能呢?
1、第一次握手

第一次握手是客户端主动发起的,简单粗暴的理解就是客户端给服务端写了一封信;

这就跟以前的人寄信一样,我自己知道自己是把信放进了邮箱里面,但是我并不知道邮差是不是把它拿出来寄出去了,

也就是说,客户端只知道自己发送了报文,但是报文有没有被发送出去就不知道,所以这个时候客户端对于自己的发送功能是否完好是不确定的;

但是当第一次握手的报文被送达服务端的时候,服务端就知道自己的接收功能是完好的了;因为它已经收到了嘛;

所以第一次握手就确定服务端的接收功能(括号内为握手编号):

Android 握手失败 握手功能_客户端_02

2.第二次握手

第一次握手是客户端发起的,第二次握手就是服务器端发起的;

别人给你写了信,你收到了肯定就要回信嘛;

那么这个时候我们就可以来看一下参数(为了方便理解,我们暂时将报文信息理解成参数):

第一次握手客户端会给服务端传过去两个参数,其中有一个是:seq=x;

SYN我们先不管,这个seq=x我们就可以看成是写在信里的内容;

第二次握手的时候服务器端给客户端返回的是4个参数,其中有2个是:seq=y;ack=x+1

那么这个ack=x+1我们就可以理解成是回答了客户端写在信里的内容,因为来信是x,客户端接收到来自服务端的x+1的时候就知道自己写出去的东西被收到了;就可以知道自己的发送功能的正常的;同时客户端也能知道自己的接收功能是正常的,因为能够接收来自服务器端的消息;

那为什么服务端也要写出信息seq=x给客户端呢?

因为服务端也不知道自己的发送功能是否正确嘛;

所以在第二次握手里面可以确定的功能是:

Android 握手失败 握手功能_tcpip_03

3.第三次握手

第三次握手是客户端发起的,就是这么一来一回的;

在第二次握手里面我们就知道握手和确认功能完善之间的逻辑,那么接下来也只剩下一个功能,就是服务端的接收功能;

服务端怎么知道自己的发送功能是正确的呢?

类比第二次握手我们就知道了,只要收到客户端关于seq的回答就好了;

第二次握手的时候服务向客户端发送了seq=y

seq发出去,那么客户端就要将对信的回复写在ack里面;

所以第三次握手所传的参数里面有ack=y+1,也就是说客户端回复了服务端的seq;

当服务端接收到这个反馈的时候就知道自己的发送功能的正确的了。

Android 握手失败 握手功能_三次握手_04

总结

总之呢就是一句话:能接收就说明接收功能正常;但是能发送不一定代表发送功能正常,发送功能需要通过**seq(写信)和ack(回信)**才能判断