作者 | 小鹿
来源 | 公众号:小鹿动画学编程

写在前边

TCP 三次握手过程对于面试是必考的一个,所以不但要掌握 TCP 整个握手的过程,其中有些小细节也更受到面试官的青睐。

对于这部分掌握以及 TCP 的四次挥手,小鹿将会以动画的形式呈现给每个人,这样将复杂的知识简单化,理解起来也容易了很多,尤其对于一个初学者来说。

学习导图

一、TCP 是什么?

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

我们知道了上述了解到了 TCP 的定义,通俗一点的讲,TCP 就是一个双方通信的一个规范标准(协议)。

我们在学习 TCP 握手过程之前,首先必须了解 TCP 报文头部的一些标志信息,因为在 TCP 握手的过程中,会使用到这些报文信息,如果没有掌握这些信息,在学习握手过程中,整个人处于懵逼状态,也是为了能够深入 TCP 三次握手的原理。

二、TCP 头部报文

2.1 source portdestination port

两者分别为「源端口号」和「目的端口号」。源端口号就是指本地端口,目的端口就是远程端口。

一个数据包(pocket)被解封装成数据段(segment)后就会涉及到连接上层协议的端口问题。

可以这么理解,我们可以想象发送方很多的窗户,接收方也有很多的窗户,这些窗口都标有不同的端口号,源端口号和目的端口号就分别代表从哪个规定的串口发送到对方接收的窗口。不同的应用程度都有着不同的端口,之前网络分层的文章中有提到过。

扩展:应用程序的端口号和应用程序所在主机的 IP 地址统称为 socket(套接字),IP:端口号, 在互联网上 socket 唯一标识每一个应用程序,源端口+源IP+目的端口+目的IP称为”套接字对“,一对套接字就是一个连接,一个客户端与服务器之间的连接。

2.2 Sequence Numbe

称为「序列号」。用于 TCP 通信过程中某一传输方向上字节流的每个字节的编号,为了确保数据通信的有序性,避免网络中乱序的问题。接收端根据这个编号进行确认,保证分割的数据段在原始数据包的位置。


再通俗一点的讲,每个字段在传送中用序列号来标记自己位置的,而这个字段就是用来完成双方传输中确保字段原始位置是按照传输顺序的。(发送方是数据是怎样一个顺序,到了接受方也要确保是这个顺序)

PS:初始序列号由自己定,而后绪的序列号由对端的 ACK 决定:SN_x = ACK_y (x 的序列号 = y 发给 x 的 ACK),这里后边会讲到。

2.3 Acknowledgment Numbe

称为「确认序列号」。确认序列号是接收确认端所期望收到的下一序列号。确认序号应当是上次已成功收到数据字节序号加1,只有当标志位中的 ACK 标志为 1 时该确认序列号的字段才有效。主要用来解决不丢包的问题。

若确认号=N,则表明:到序号N-1为止的所有数据都已正确收到。

在这里,现在我们只需知道它的作用是什么,就是在数据传输的时候是一段一段的,都是由序列号进行标识的,所以说,接收端每接收一段,之后就想要的下一段的序列号就称为「确认序列号」。

2.4 TCP Flag

TCP 首部中有 6 个标志比特,它们中的多个可同时被设置为 1,主要是用于操控 TCP 的状态机的,依次为URG,ACK,PSH,RST,SYN,FIN

不要求初学者全部掌握,在这里只讲三个重点的标志:

2.4.1 ACK

这个标识可以理解为发送端发送数据到接收端,发送的时候 ACK 为 0,标识接收端还未应答,一旦接收端接收数据之后,就将 ACK 置为 1,发送端接收到之后,就知道了接收端已经接收了数据。

此标志表示「应答域有效」,就是说前面所说的TCP应答号将会包含在 TCP 数据包中;有两个取值:0 和 1,为 1 的时候表示应答域有效,反之为 0;

2.4.2 SYN

表示「同步序列号」,是 TCP 握手的发送的第一个数据包。

用来建立 TCP 的连接。SYN 标志位和 ACK 标志位搭配使用,当连接请求的时候,SYN=1,ACK=0连接被响应的时候,SYN=1,ACK=1;这个标志的数据包经常被用来进行端口扫描。扫描者发送一个只有 SYN 的数据包,如果对方主机响应了一个数据包回来 ,就表明这台主机存在这个端口。看下面动画:

2.4.3 FIN

表示发送端已经达到数据末尾,也就是说双方的数据传送完成,没有数据可以传送了,发送FIN标志位的 TCP 数据包后,连接将被断开。这个标志的数据包也经常被用于进行端口扫描。

这个很好理解,就是说,发送端只剩最后的一段数据了,同时要告诉接收端后边没有数据可以接受了,所以用FIN标识一下,接收端看到这个FIN之后,哦!这是接受的最后的数据,接受完就关闭了。动画如下:

2.5 Window size

称为滑动窗口大小。所说的滑动窗口,用来进行流量控制。

3、为什么进行 TCP 三次握手?

如果之前你不了解网络分层的话,建议看看写的文章。

你真的懂网络分层协议吗?

第一,为了确认双方的接收与发送能力是否正常。第二,指定自己的初始化序列号,为后面的可靠传送做准备。第三,如果是 https 协议的话,三次握手这个过程,还会进行数字证书的验证以及加密密钥的生成到。

如果你了解 UDP 的话,TCP 的出现正式弥补了 UDP 不可靠传输的缺点。但是 TCP 的诞生,也必然增加了连接的复杂性。

4、TCP 三次握手过程?

TCP 三次握手的过程掌握最重要的两点就是客户端和服务端状态的变化,另一个是三次握手过程标志信息的变化,那么掌握 TCP 的三次握手就简单多了。下面我们就以动画形式进行拆解三次握手过程。

  • 初始状态:客户端处于 closed(关闭)状态,服务器处于 listen(监听) 状态。
  • 第一次握手:客户端发送请求报文将 SYN = 1同步序列号和初始化序列号seq = x发送给服务端,发送完之后客户端处于SYN_Send状态。

  • 第二次握手:服务端受到 SYN 请求报文之后,如果同意连接,会以自己的同步序列号SYN(服务端) = 1、初始化序列号 seq = y和确认序列号(期望下次收到的数据包)ack = x+ 1 以及确认号ACK = 1报文作为应答,服务器为SYN_Receive状态。

  • 第三次握手: 客户端接收到服务端的 SYN + ACK之后,知道可以下次可以发送了下一序列的数据包了,然后发送同步序列号 ack = y + 1和数据包的序列号 seq = x + 1以及确认号ACK = 1确认包作为应答,客户端转为established状态。

5、为什么不是一次、二次握手?

防止了服务器端的一直等待而浪费资源。

为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。如果此时客户端发送的延迟的握手信息服务器收到,然后服务器进行响应,认为客户端要和它建立连接,此时客户端并没有这个意思,但 server 却以为新的运输连接已经建立,并一直等待 client 发来数据。这样,server 的很多资源就白白浪费掉了。

----------------------------------------------------------------------- 于2019/11/11 修改 ------------------------------------------------------------------
主要对文章中存在的笔误和错误进行了修改,动画也进行了重新制作和修改,文章内容也进行的部分内容增加 —— 三次握手过程详细细节部分。再次感谢大家对小鹿文章的支持!

下一篇:动画:用动画给女朋友讲解 TCP 四次分手过程

福利:可以在我的公众号『小鹿动画学编程』,后台回复『资源』即可获取。

❤️ 不要忘记留下你学习的脚印 [点赞 + 收藏 + 评论]

一些后台小伙伴问我平常如何学习的,学习资料哪里获取,我就不一一回复了!一般我都是通过看一些编程书籍和开源的社区进行自学,一些学习资料和电子书也分享到下边了,有需要的自取。

编程在于永无止境的去学习,去学习前辈积累的经验,书籍就是最好的一种媒介方式,列出以下自己看过的优秀书籍,整理成了 PDF 版。

  • 前端:《javascript高级程序设计》《JavaScript 权威指南》《你不知道的JavaScript(上中下卷)》等;
  • java:《Effective Java》《Thinking in Java》《Java 编程思想》《java核心技术》等;
  • 算法:《大话数据结构》《算法图解》《算法导论》《编程之美》《数据结构与算法:C语言描述》等;
  • 其他相关计算机书籍;

搜索我的公众号:「小鹿动画学编程」后台回复关键词

  • 回复「后台」,获取 java 等自学资料
  • 回复「前端」,获取前端等自学资料
  • 回复「电子书」获取一下书籍资料!

动一动你的小手,点赞就完事了,每个人出一份力量(点赞 + 评论)就会让更多的学习者加入进来!非常感谢! ̄ω ̄=

作者Info:

【作者】:小鹿

【原创公众号】:小鹿动画学编程。

【简介】:和小鹿同学一起用动画的方式从零基础学编程,将 Web前端领域、数据结构与算法、网络原理等通俗易懂的呈献给小伙伴。先定个小目标,原创 1000 篇的动画技术文章,和各位小伙伴共同努力一起学习!公众号回复 “资料” 送一从零自学资料大礼包!

【转载说明】:转载请说明出处,谢谢合作!~

动画:用动画给面试官解释 TCP 三次握手过程相关推荐

  1. 串口发送tcp数据 源端口号_三分钟基础知识:用动画给面试官解释 TCP 三次握手过程...

    作者 |  小鹿 来源 |  小鹿动画学编程 写在前边 TCP 三次握手过程对于面试是必考的一个,所以不但要掌握 TCP 整个握手的过程,其中有些小细节也更受到面试官的青睐. 对于这部分掌握以及 TC ...

  2. 大白话解释TCP三次握手

    大白话解释TCP三次握手 原文地址:http://www.cnblogs.com/yuilin/archive/2012/11/05/2755298.html 一.TCP三次握手 在TCP/IP协议中 ...

  3. TCP 三次握手过程详解

    TCP(Transmission Control Protocol) 传输控制协议 TCP:面向连接的,可靠的,基于字节流的传输层通信协议 TCP(传输层)位于IP层(网络层)之上,应用层之下,不同的 ...

  4. 关于TCP三次握手过程

    三次握手的过程 (1)首先客户端向服务器端发送一段TCP报文,其中: 标记位为SYN,表示"请求建立新连接";序号为Seq=X(X一般为1):随后客户端进入SYN-SENT阶段. ...

  5. TCP三次握手过程,如果两次握手会怎么样?

    让我们来看一个故事,读完这个故事,我相信你和面试官的对话会非常愉快. 网络帝国的崛起 随着时间的流逝,计算机帝国的子民耐不住寂寞,他们好想去外面的世界看看,去其他的计算机家中串串门,他们经常抱怨,为什 ...

  6. 【抓包工具】Wireshark(详细介绍与TCP三次握手数据分析)

    wireshark(官方下载网站: http://www.wireshark.org/),是用来获取网络数据封包,可以截取各种网络封包,显示网络封包的详细信息,包括http,TCP,UDP,等网络协议 ...

  7. 抓包工具 - Wireshark(详细介绍与TCP三次握手数据分析)

    功能使用的详细介绍 wireshark(官方下载网站: http://www.wireshark.org/),是用来获取网络数据封包,可以截取各种网络封包,显示网络封包的详细信息,包括http,TCP ...

  8. 吊打面试官!近 40 张图解被问千百遍的 TCP 三次握手和四次挥手面试题

    作者 | 小林coding 来源 | 小林coding(ID:CodingLin) 不管面试 Java .C/C++.Python 等开发岗位, TCP 的知识点可以说是的必问的了. 任 TCP 虐我 ...

  9. TCP三次握手和四次挥手详解(面试常见问题)

    大概两个月前,一位朋友在面试360集团时,在面试过程中被问及TCP三次握手和四次挥手的相关知识,他当时只知道大概,但当时面试官问他TCP三次握手过程中发送的数字是多少,他一下子就懵住了,因为这也是他第 ...

  10. 硬不硬你说了算!近 40 张图解被问千百遍的 TCP 三次握手和四次挥手面试题

    来自:小林coding 每日一句英语学习,每天进步一点点: 前言 不管面试 Java .C/C++.Python 等开发岗位, TCP 的知识点可以说是的必问的了. 任 TCP 虐我千百遍,我仍待 T ...

最新文章

  1. python——装饰器
  2. 关于推荐系统的一些小结
  3. Laravel 中的 视图和模型
  4. [转载] Java中变量与常量
  5. 没有bug队——加贝——Python 43,44
  6. Java 时间处理(格式解释、格式化时间、获取当前时间、获取年份、月份等、时间戳转换成时间)
  7. 博弈——NimSG函数函数(hdu1848)
  8. 计算机广告制作专业老师,计算机广告制作专业专业院校诚信服务_招生梁老师...
  9. 关于灵魂安放,年轻人如何选择适合自己的城市呢?学长有话说
  10. oracle 042 第八章:管理数据和并发处理
  11. 基于http live streaming, 使用vlc + mediastreamsegmenter + apache 实现iOS视频直播
  12. python开发的代码如何加密_python 代码加密
  13. 台式计算机显卡驱动位置,如何在HP台式计算机上安装图形驱动程序
  14. 被称为“圣经”的《计算机体系结构》
  15. execute()方法
  16. Android距离传感器unregisterListener无用解决
  17. ppt 计算机课件模板,大学计算机基础课件模板.PPT
  18. 【C++】模板特化、偏特化
  19. Python-生成gif图片验证码
  20. idea 配置 tomcat session 无法活化

热门文章

  1. SEO和SEM的区别是什么?
  2. python 实现线程安全的单例模式
  3. 飞到半路被撞?不是小鸟不专心,而是太阳能太晃眼
  4. 你还不知道web自动化测试是什么吧?今天让你发现新大陆
  5. win10如何调整计算机时间同步,Win10系统时间不准如何解决 win10系统设置时间同步的方法...
  6. phpstudy下载、安装、配置、网站部署、卸载
  7. 自定义 View 之圆形、圆角、爱心、动态旗帜等图片效果
  8. Screw 整合Oracle 报错异常信息oracle.jdbc.driver.T4CConnection.isValid(I)Z
  9. 阿里云认证未来网络学院ACE公开课——30分钟掌握ACE考试通关攻略
  10. Docker镜像加速