TCP三次握手图解与实践总结

之前在面试的时候面试官问到了TCP三次握手的连接,虽然自己都懂,但是还有很多细节的地方被我忽略了,所以这里提醒下大家,要学好技术,每一个重要知识点都要扣的细一些,不要给自己的知识库留下任何盲区,否则只能是懂得表面不懂原理的半桶水的状态。

稍微有计算机网络基础的人都知道TCP的建立是通过三次握手,但是一个URL的访问,从按下回车键开始,到TCP的建立,中间经历了什么?

以下我把我的总结写下来和大家分享,也能够加深自己的印象。(参考《计算机网络》,第6版,谢希仁著)。

1、三次握手的步骤和图解

假设现有客户端A和服务器B

第一次握手:客户端A向服务器B发送连接请求报文段,同步位SYN=1,序列号seq=x,并进入SYNSEND状态;

第二次握手:服务器B接到客户端的请求之后,返回一个确认报文,同部位SYN=1,确认位ACK=1,序列号seq=y,确认号ack=x+1(表示x和x之前的字节流都已收到),并进入SYNRCVD状态;

第三次握手:客户端A在收到服务器B的确认后还要继续返回一个确认报文,确认位ACK=1,seq=x+1,ack=y+1(注意第三次握手的SYN=0)。


图解如下:

TCP三次握手图解与实践总结_第1张图片



2、TCP三次握手的详细信息

下面我们通过抓包软件wireshark来实践并分析TCP连接

先交代下背景:

客户端IP:192.168.1.3

DNS服务器IP:192.168.1.1

www.baidu.com对应的IP:14.215.177.38

操作过程:

1.通过wireshark开始抓包,

2.打开浏览器访问URL:www.baidu.com,

3.通过逻辑表达式筛选出只与这次操作有关的IP地址((ip.src == 192.168.1.3&&ip.dst == 14.215.177.38)||(ip.src == 14.215.177.38&&ip.dst == 192.168.1.3)||(ip.src == 192.168.1.3&&ip.dst == 192.168.1.1)||(ip.src == 192.168.1.1&&ip.dst == 192.168.1.3))

4.分析抓到的数据包


结果分析:

从访问URL开始到TCP三次握手建立连接后的结果如下图




从NO.2可以看出,第一步是向DNS服务器请求解析www.baidu.com域名,

从NO.3可以看出,第二步是DNS服务器解析后向客户端返回域名对应的IP地址,

NO.776表示TCP的第一次握手,下图为TCP第一次握手的首部信息

TCP三次握手图解与实践总结_第2张图片


从中可以看到,TCP的首部信息包括源端口,目的端口,序列号,确认号,首部长度,flags,窗口大小,检验和,紧急指针等信息,其中的SYN为Set,即表示SYN=1,

Sequence number:0,表示序列号seq=0,其他信息读者可以自行查看。


NO.777表示TCP的第二次握手,下图为TCP第二次握手的首部信息

TCP三次握手图解与实践总结_第3张图片


这一次的源端口号和目的端口号是反过来,说明第二次握手是从服务端发送的报文段。其中的SYN=1,ACK=1,seq=0,ack=1(为第一次的ack+1)


NO.778表示TCP的第三次握手,下图为TCP第三次握手的首部信息

TCP三次握手图解与实践总结_第4张图片


源端口号和目的端口号和第一次握手的一样,说明是客户端向服务端发送的报文段。其中的ACK=1,seq=1,ack=1。


3、只有两次握手的话造成的问题

假设TCP只有两次握手即可建立连接,现有一种情况:客户端A向服务端B发送一个请求连接报文段,因为网络堵塞,该报文段没有被传送到B但未丢失,A再重传一个请求连接报文段,这次B收到了第二次发送的报文段,B再发回确认报文段,此刻连接已建立。当数据传完了连接断开,此时A第一次发送的请求连接报文段延迟传送到了B,这是一个失效的请求连接报文段,B误以为A又请求连接,于是向A发送确认报文段,同意建立连接,因为是采用两次握手,那么多余的连接就会被建立,从而造成资源浪费。



4.问题

TCP是采用三次握手建立连接,但是当第二次握手完成的时候客户端A就已经变成了ESTABLISHED状态,是不是就代表A往B方向的连接就已经建立并可以从A往B发送数据了?TCP三次握手后的连接是全双工的,那么此刻是不是就代表已经是半双工了?这是我存在的一个问题,希望知道答案的读者可以通过留言一起讨论下,谢谢。



你可能感兴趣的:(计算机网络)