面试官又双叒叕问你TCP的三次握手和四次挥手?看这里!有图有真相!!

本文主要是介绍面试官又双叒叕问你TCP的三次握手和四次挥手?看这里!有图有真相!!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载:技术小虫有点萌 老A技术联盟

原文:https://mp.weixin.qq.com/s/DQpWsg28wVj33Owms6ENAw

已与作者留言,侵权请联系删除。

先来了解一下OSI模型

  • 开放式系统互联模型(英语:Open System Interconnection Model,缩写:OSI;简称为OSI模型)是一种[概念模型],由[国际标准化组织]提出,一个试图使各种计算机在世界范围内互连为网络的标准框架。定义于ISO/IEC 7498-1。
  • 该模型将通信系统中的数据流划分为七个层,从跨通信介质传输位的物理实现到分布式应用程序数据的最高层表示。每个中间层为其上一层提供功能,其自身功能则由其下一层提供。功能的类别通过标准的通信协议在软件中实现。
    在这里插入图片描述
每一层对应的设备和应用
  • 物理层:数据通信的基础设备,比如网卡(它提供了mac地址),网线,集线器,中继器,调制解调器
  • 数据链路层:管理相邻节点的数据通信!比如网桥,交换机
  • 网络层:路由器是工作在第三层的(在tcp/ip中属于第二层的,下面会讲到),决定数据在网络中的传输路径,常见的有:IP、ICMP、IPX、BGP、OSPF、RIP、IGRP、EIGRP、ARP、RARP、X.25
  • 传输层:管理端到端的通信连接,那什么是端到端?就是计算机以端口来标记不同的网络进程,而两个远程计算机的进程交互,就是端到端。常见的有:TCP、UDP、RTP、SCTP、SPX、ATP、IL
  • 会话层:会话层(Session)是建立在传输层之上,利用传输层提供的服务,使应用建立和维持会话,常见的有:ASAP、ISO 8327 / CCITT X.225、RPC、NetBIOS、Winsock、BSD sockets、SOCKS、密码验证协议
  • 表示层:数据处理,比如编码解码,加密解密等,常见的有:XDR、ASN.1、NCP、TLS、ASCII
  • 应用层:为计算机用户提供接口和服务,是七层中和用户最近的一层,HTTP(万维网服务)、FTP(文件传输)、SMTP(电子邮件)、SSH(安全远程登录)、DNS(名称⇔IP地址寻找)以及许多其他协议。
TCP/IP四层模型
  • osi是理论专家提出来的,但是在实际应用中,发现并不实用,通常人们认为OSI模型的最上面三层(应用层、表示层和会话层)在TCP/IP组中是一个应用层。而物理层和数据链路层应该是属于网络接口层,于是就有了tcp/ip
  • 其实还有五层的,这里不做过多介绍
    在这里插入图片描述

聊一聊TCP

  • TCP,全称Transmission Control Protocol,是一种传输控制协议,TCP协议也是计算机网络中非常复杂的一个协议

  • TCP的特点:

    • TCP是面向连接的协议
    • TCP是端到端的链接
    • TCP提供可靠的传输服务
    • TCP协议提供全双工的通信
    • TCP是面向字节流的协议
  • TCP报文格式
    在这里插入图片描述

TCP报文首部
  • 源端口和目的端口,各占2个字节,分别写入源端口和目的端口;
  • 序号,占4个字节,TCP连接中传送的字节流中的每个字节都按顺序编号。例如,一段报文的序号字段值是 301 ,而携带的数据共有100字段,显然下一个报文段(如果还有的话)的数据序号应该从401开始;
  • 确认号,占4个字节,是期望收到对方下一个报文的第一个数据字节的序号。例如,B收到了A发送过来的报文,其序列号字段是501,而数据长度是200字节,这表明B正确的收到了A发送的到序号700为止的数据。因此,B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701;
  • 数据偏移,占4位,它指出TCP报文的数据距离TCP报文段的起始处有多远;
  • 保留,占6位,保留今后使用,但目前应都为0;
  • 紧急URG,当URG=1,表明紧急指针字段有效。告诉系统此报文段中有紧急数据;
  • 确认ACK,仅当ACK=1时,确认号字段才有效。TCP规定,在连接建立后所有报文的传输都必须把ACK置1;
  • 推送PSH,当两个应用进程进行交互式通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应,这时候就将PSH=1;
  • 复位RST,当RST=1,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立连接;
  • 同步SYN,在连接建立时用来同步序号。当SYN=1,ACK=0,表明是连接请求报文,若同意连接,则响应报文中应该使SYN=1,ACK=1;
  • 终止FIN,用来释放连接。当FIN=1,表明此报文的发送方的数据已经发送完毕,并且要求释放;
  • 窗口,占2字节,指的是通知接收方,发送本报文你需要有多大的空间来接受;
  • 检验和,占2字节,校验首部和数据这两部分;
  • 紧急指针,占2字节,指出本报文段中的紧急数据的字节数;
  • 选项,长度可变,定义一些其他的可选的参数。

面试官又双叒叕问你TCP的三次握手和四次挥手?来,答案在这里!

  • 先来通俗的讲一讲,什么是三次握手,其实三次握手的目的在于一句话,就是让我知道你已经知道了,比如下面一个打电话的场景;刘备打电话给张飞

  • 如果两个人想要有一个正常的通话,必须保证张飞能听得到, 于是有了第一次握手,刘备问张飞,你能听得到吗?

  • 张飞听到刘备的请求,开始第二次握手,说,我能听到,你呢?

  • 刘备听到了张飞的话,首先自己知道了,原来张飞那小子能听到我说话,于是建立了连接,但是张飞那傻小子还等着刘备回信呢,在那犯嘀咕,我大哥到底能不能听到我说话,这个时候刘备开始了第三次握手,告诉张飞,我也可以听到你说话。张飞听到后,也建立了连接,至此,连接完成!

  • 然后两人就开始得啵得啵得!

那么我们从专业的角度解读一下这个三次握手
在这里插入图片描述

  • 第一次握手,发送方主动发起请求,SYN=1 表示我要建立连接,seq=x 表示序列号(用于甄别是哪一次的请求,序列号即被消耗掉了)
  • 第二次握手,接收方接成功收到请求后,先是ACK=1 表示接收到了,SYN=1表示我也要建立连接,seq=y 表示序列号(用于甄别是哪一次的请求,序列号即被消耗掉了),ack=x+1,表示我想要你的序列号是 x+1;
  • 第三次握手,发送方 ACK=1,表示我接收到了,seq=x+1 这是接收方要求要的,ack=y+1 表示下一次想要的序列号
  • 其中第二次握手之后,发送方就已经建立了连接,第三次握手之后,接收方建立连接;
下面我使用wireshark 抓包工具来看一下三次握手的过程
  • 第一次握手
    在这里插入图片描述
    • 这就是我们前面提到的tcp报文结构
      在这里插入图片描述
    • 再来看一下tcp标记
      在这里插入图片描述
  • 第二次握手
    在这里插入图片描述
  • 第三次握手
    在这里插入图片描述
  • 这里面强调一个问题

为什么要发送第三个确认报文?其实主要还是为了给这次握手做个了结,如果没有第三次会发生什么情况呢?弄清这个问题,我们需要先弄明白三次握手的目的是什么,能不能只用两次握手来达到同样的目的。

第一次握手:客户端发送网络包,服务端收到了。这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。第二次握手:服务端发包,客户端收到了。这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。第三次握手:客户端发包,服务端收到了。这样服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。因此,需要三次握手才能确认双方的接收与发送能力是否正常。

试想如果是用两次握手,则会出现下面这种情况:

如客户端发出连接请求,但因连接请求报文丢失而未收到确认,于是客户端再重传一次连接请求。后来收到了确认,建立了连接。数据传输完毕后,就释放了连接,客户端共发出了两个连接请求报文段,其中第一个丢失,第二个到达了服务端,但是第一个丢失的报文段只是在某些网络结点长时间滞留了,延误到连接释放以后的某个时间才到达服务端,此时服务端误认为客户端又发出一次新的连接请求,于是就向客户端发出确认报文段,同意建立连接,不采用三次握手,只要服务端发出确认,就建立新的连接了,此时客户端忽略服务端发来的确认,也不发送数据,则服务端一致等待客户端发送数据,浪费资源。

还是刚才打电话的栗子,如果是两次握手,第一次刘备说,你能听得到吗?但是是张飞没听到,可能是某一个瞬间 信号不好,网络阻塞,或者被外星人劫持,由于刘备没有收到张飞的回应,又发了一次请求,说,小飞飞,你听得到吗?这时张飞听到了,开始第二次握手,回答说我听到了,此时连接建立!通话结束后,张飞刚想走,这个时候听到大哥第一次的呼唤,你听得到吗吗吗吗????于是张飞又一次建立了连接,而此时,刘备已经去白帝城了,而张飞一直在等,等他的大哥。。。。。很悲剧的故事,对不对,哈哈,但是对于计算机来说,这是一种资源浪费!

再来看看四次挥手,即TCP连接的释放

先来通俗的,简单易懂的讲一下;比如下面这个场景

  • 下课铃响,莫小贝对老夫子说,夫子,下课了,这是第一次挥手,莫小贝就不再跟老夫子互动了,坐等下课(等待),夫子也不看莫小贝的反应了(关闭等待),

  • 但是夫子爱拖课(大家最烦这种套路的老师啦,哈哈)!说,我知道了,等我讲完这一点就下课,于是莫小贝还得干等(第二次等待),这是第二次挥手,

  • 老夫子孤独的讲了五分钟后,说我讲完了,下课!这是第三次挥手(最后确认)

  • 莫小贝说,我知道了,你大爷的(有点不尊师重道哈,要批判)!这是第四次挥手

  • 至此,四次挥手完毕,tcp释放连接

我们再从专业的角度解读一下
在这里插入图片描述

  • 第一次挥手,发送方主动发起释放请求,FIN=1表示结束连接,seq=u和前面一样序列号

  • 第二次挥手,接收方ACK=1表示接收方收到了,seq=v是 接收方的序列号,ack=u+1,表示下次希望接收的序列号

  • 第三次挥手,接收方发起释放请求,FIN=1表示要释放,ACK=1表示接收到了释放请求,seq=w表示本次序列号,ack=u+1表示下次希望接收的序列号

  • 第四次挥手,发送方ACK=1表示接收到了,seq=u+1,是第三次挥手要求的序列号,ack=w+1表示希望下次得到的序列号;

  • 从上面可以看出,发送方发送断开请求后,接收方就关闭了等待,由于发送方没有接收到接收方的断开请求,就一直处于等待状态,只到第三次挥手,开始等待计时!而接收方在第四次挥手后就关闭了。发送方在等待计时结束后关闭

  • 下面我们来说一说什么是 等待计时器

    • 先了解一下这个,MSL(Max Segment Lifetime): 最长报文段寿命,就是说报文的最长存活时间,怎么设置呢?以linux为例,cat /proc/sys/net/ipv4/tcp_fin_timeout,好了,这个点到为止!
    • tcp的等待计时 时长一般是 2MSL,就是两倍的报文寿命
  • 为什么要等待2MSL? 1.为了保证所有的报文都已经传送(或者过期) 2.为了保证发送方的ACK可以到达接收方,在2MSL时间内如果接收方没有收到发送方的ACK,则接收方会再次发起第三次挥手

来看一下四次挥手的抓包
  • 第一次挥手[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
    在这里插入图片描述
  • 第二次挥手
    在这里插入图片描述
  • 第三次挥手
    在这里插入图片描述
  • 第四次挥手
    在这里插入图片描述

这篇关于面试官又双叒叕问你TCP的三次握手和四次挥手?看这里!有图有真相!!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/328012

相关文章

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

2024.9.8 TCP/IP协议学习笔记

1.所谓的层就是数据交换的深度,电脑点对点就是单层,物理层,加上集线器还是物理层,加上交换机就变成链路层了,有地址表,路由器就到了第三层网络层,每个端口都有一个mac地址 2.A 给 C 发数据包,怎么知道是否要通过路由器转发呢?答案:子网 3.将源 IP 与目的 IP 分别同这个子网掩码进行与运算****,相等则是在一个子网,不相等就是在不同子网 4.A 如何知道,哪个设备是路由器?答案:在 A

图解TCP三次握手|深度解析|为什么是三次

写在前面 这篇文章我们来讲解析 TCP三次握手。 TCP 报文段 传输控制块TCB:存储了每一个连接中的一些重要信息。比如TCP连接表,指向发送和接收缓冲的指针,指向重传队列的指针,当前的发送和接收序列等等。 我们再来看一下TCP报文段的组成结构 TCP 三次握手 过程 假设有一台客户端,B有一台服务器。最初两端的TCP进程都是处于CLOSED关闭状态,客户端A打开链接,服务器端

【吊打面试官系列-Redis面试题】说说 Redis 哈希槽的概念?

大家好,我是锋哥。今天分享关于 【说说 Redis 哈希槽的概念?】面试题,希望对大家有帮助; 说说 Redis 哈希槽的概念? Redis 集群没有使用一致性 hash,而是引入了哈希槽的概念,Redis 集群有 16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽, 集群的每个节点负责一部分 hash 槽。

网络原理之TCP协议(万字详解!!!)

目录 前言 TCP协议段格式 TCP协议相关特性 1.确认应答 2.超时重传 3.连接管理(三次握手、四次挥手) 三次握手(建立TCP连接) 四次挥手(断开连接)  4.滑动窗口 5.流量控制 6.拥塞控制 7.延迟应答 8.捎带应答  9.基于字节流 10.异常情况的处理 小结  前言 在前面,我们已经讲解了有关UDP协议的相关知识,但是在传输层,还有

linux下TCP/IP实现简单聊天程序

可以在同一台电脑上运行,在一个终端上运行服务器端,在一个终端上运行客户端。 服务器端的IP地址要和本地的IP相同,并分配端口号,客户端的默认设置为本地,端口号自动分配。 服务器端: #include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <sys/types.

JAVAEE初阶第七节(中)——物理原理与TCP_IP

系列文章目录 JAVAEE初阶第七节(中)——物理原理与TCP_IP 文章目录 系列文章目录JAVAEE初阶第七节(中)——物理原理与TCP_IP 一.应用层重点协议)1. DNS2 .NAT3. NAT IP转换过程 4 .NAPT5. NAT技术的缺陷6. HTTP/HTTPS7. 自定义协议 二. 传输层重点协议 1 .UDP协议 2.1.1 UDP协议端格式 2.1.2 UD

深入理解TCP通信

这大概是自己博客上面第三次写TCP通信demo了,总是写同样的内容也不太好啊,不过每一次都比前一次进步一点。这次主要使用了VIM编辑工具、gdb调试、wireshirk、netstat查看网络状态。 参考《C++服务器视频教程》、《Unix网络编程》 一、VIM常用命令 vim server.cpp #打开一个文件:w 写入文件:wq 保存并退出:q! 不保存退出显示行号

[情商-13]:语言的艺术:何为真实和真相,所谓真相,就是别人想让你知道的真相!洞察谎言与真相!

目录 前言: 一、说话的真实程度分级 二、说谎动机分级:善意谎言、中性谎言、恶意谎言 三、小心:所谓真相:只说对自己有利的真相 四、小心:所谓真相:就是别人想让你知道的真相 五、小心:所谓善解人意:就是别人只说你想要听到的话 前言: 何为真实和真相,所谓真相,就是别人想让你知道的真相!洞察谎言与真相! 人与人交流话语中,处处充满了不真实,完全真实的只是其中一小部分,这

面试官:synchronized的锁升级过程是怎样的?

大家好,我是大明哥,一个专注「死磕 Java」系列创作的硬核程序员。 回答 在 JDK 1.6之前,synchronized 是一个重量级、效率比较低下的锁,但是在JDK 1.6后,JVM 为了提高锁的获取与释放效,,对 synchronized 进行了优化,引入了偏向锁和轻量级锁,至此,锁的状态有四种,级别由低到高依次为:无锁、偏向锁、轻量级锁、重量级锁。 锁升级就是无锁 —>