字节一面:说说TCP的三次握手
上周有朋友去了字节面试,问到了
TCP
三次握手的问题,当时回答的不是很好,对于三次握手的发送的报文信息都不太熟,本文主要做一下总结和记录。
TCP
全称为Transmission Control Protocol
(传输控制协议),是一种面向连接的、可靠的、基于字节流
的传输层通信协议。TCP
也是全双工通信协议,表示客户端可以给服务端发送消息,服务端也可以向客户端发送消息。
报文
TCP
处于ISO
七层模型的传输层
,传输层的单位是报文
,报文信息如下:
Source port 和 Destination port
其中Source port
和Destination port
分别代表发送端口
和接收端口
。两个不同机器上的进程通信,需要通过端口
和IP协议中的IP
标识唯一的进程。
Sequence number 和 Acknowledgment number
Sequence number
表示序列号
,表示要发送数据的起始号,在下面的三次握手使用seq
表示,Acknowledgment number
表示确认号
,返回确认号,表示消息已经接收,返回下次要发送的起始号。在下面的三次握手使用ackNum
标识。
TCP flag
TCP flag
表示TCP
标志位,主要介绍两个ACK
和SYN
:
SYN
同步序号,用于建立连接过程。ACK
确认序号标识,标识表示发送信息已确认接收。
Windows Size
TCP
使用滑动窗口
来实现流量控制
,根据窗口大小,确认要发送数据包的个数。
TCP 三次握手
TCP
三次握手,是指建立一个TCP
连接时,需要客户端和服务器总共发送3
个包。三次握手的目的是连接服务指定端口,建立 TCP 连接,并确认
连接双方的序列号
和确认号
,确认TCP
窗口大小信息。
三次握手详解:
- 第一次握手
SYN=1,seq=x
- 客户端发送一个
TCP
的SYN
标志位为1
的包,指定客户端连接的服务器端口,初始序列号seq
为x
。发送完毕之后客户端进入SYN_SEND
。
- 客户端发送一个
- 第二次握手
SYN=1,ACK=1,seq=y,ACKnum=x+1
- 服务器发回确认包
ACK
应答。即SYN
标志位和ACK
标志位均为1。服务器端发送序列号seq
为y
,同时将确认序号ackNum
设置为客户端的序列号seq+1
,ackNum
表示要下次要发送数据包序列号的起始值。发送完毕后,服务端进入SYN_SEND
状态。
- 服务器发回确认包
- 第三次握手
ACK=1,ACKnum=y+1
- 客户端再次发送确认包
ACK
,ACK 标志位为1
,并且把服务器发来的ackNum
作为起始序号seq
发送给服务端,确认号ackNum
为服务端发送的序列号+1
也就是y+1
,放在确认字段中发送给对方, - 发送完毕后,客户端进入
ESTABLISHED
状态,当服务器端接收到这个包时,也进入ESTABLISHED
状态,开始数据传输。
- 客户端再次发送确认包
wireshake 抓包
为了更好理解三次握手,使用wireshakej进行抓包。首先请求访问链接,TCP
三次握手对应下面编号57
、63
、64
:
- 第一步:
192.168.5.150
---->47.98.202.133
[SYN] seq=0 - 第二步:
47.98.202.133
---->192.168.5.150
[SYN ACK] seq=0 ack=1 - 第三步:
192.168.3.150
---->47.98.202.133
[ACK] seq=1 ack=1
记忆口诀
那么在面试的时候应该如何记忆三次握手的流程?三次握手是为了建立连接,其中主要是为了确认客户端和服务端的序列号seq
,那么确认序列号
就需要接收方返回序列号,来确保自己发送的序列号能成功发送。
- 第一次握手和第二次握手
确保客户端的序列号
,所以第一次发送seq
,第二次返回ack
,当接收到返回信息,表明确认了客户端序列号
。第一次和第二次都是建立连接过程,所以都带有SYN
标记位。而第二次返回号,所以第二次带ACK
标志位。 - 第一次发送了序号
seq
为x
,返回确认号ackNum
为x+1
,因为发送消耗了一个序号,所以ackNum
要加1
。 - 第二次握手和第三次握手是为了确保服务端的序列号,服务端发送序列号
seq
,客户端返回确认号ackNum
,值为seq+1
。第二次握手要发送序号和返回上一次的握手的确认号,所以第二次握手带有SYN
和ACK
标志位。并且要发送序列号seq
和确认号ackNum
。第三次握手是确认服务端发送序列号,所以带有标志位ACK
,返回确认号ackNum
。
为啥 TCP 需要三次握手,不是两次,四次
TCP
三次握手是为了确认双方的序列号,这就像一个发送—应答
机制,客户端发序列号,服务端返回确认号,此时确认了客户端的序列号。如果是两次握手,只能确认客户端的序列号,无法确认服务端的序列号。三次握手是确认两个序列号最小的连接次数。四次也可以,但是没有必要,需要减少握手的次数,加快连接速度。
总结
- 本文先介绍了报文头信息,三次握手主要用到了:
- 序列号
seq
,确认号ackNum
。 TCP
标记位,SYN
同步序号,表示建立连接过程。ACK
确认序号标识,标识表示发送信息已确认接收
- 序列号
- 三次握手详解:
- 第一次握手,客户端发送带有
SYN
标记位的包,带有初始化序列号x
,发送完毕客户端进入SYN_SEND
状态。 - 第二次握手,服务端返回应答标记位
ACK
,并返回确认号ackNum
为x+1
,x+1
表示发送消耗了一个序列号。返回了确认号表示确认
了客户端序列号。服务端也要发送序列号y
,所以也要带有SYN
的标记位。 - 第三次握手客户端发送确认包
ackNum
为y+1
,所以带确认序号标志ACK
。建立连接,发送序号x+1
,开始传输数据。
- 第一次握手,客户端发送带有
参考
字节一面:说说TCP的三次握手的更多相关文章
- 简析TCP的三次握手与四次分手
TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇文章时,我想你也知道TCP的概念了,想要更深入的了解TCP的工作,我们就继续.它只是一个超级麻烦的协议,而它又是互联网的基础,也 ...
- TCP的三次握手(建立连接)和四次挥手(关闭连接)
参照: http://course.ccniit.com/CSTD/Linux/reference/files/018.PDF http://hi.baidu.com/raycomer/item/94 ...
- 简析TCP的三次握手与四次挥手
TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇文章时,我想你也知道TCP的概念了,想要更深入的了解TCP的工作,我们就继续.它只是一个超级麻烦的协议,而它又是互联网的基础,也 ...
- 简析TCP的三次握手与四次分手【转】
转自 简析TCP的三次握手与四次分手 | 果冻想http://www.jellythink.com/archives/705 TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇文 ...
- 【转载】简析TCP的三次握手与四次分手
最近在补习HTTP协议相关知识点,看到这篇讲得不错,所以转载收藏一下,同时也分享给大家.原文地址:http://www.jellythink.com/archives/705,版权归原作者所有. TC ...
- TCP的三次握手与四次挥手
TCP的三次握手与四次挥手 一.TCP(Transmission Control Protocol 传输控制协议) TCP是面向对连接,可靠的进程到进程通信的协议 TCP是提供全双工服务,即数据可在同 ...
- TCP的三次握手与四次挥手(个人总结)
序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生:给字节编上序号后,就给每一个报文段指派一个序号:序列号seq就是这个报文 ...
- 在深谈TCP/IP三步握手&四步挥手原理及衍生问题—长文解剖IP
如果对网络工程基础不牢,建议通读<细说OSI七层协议模型及OSI参考模型中的数据封装过程?> 下面就是TCP/IP(Transmission Control Protoco/Interne ...
- 你应该这么理解TCP的三次握手和四次挥手
前言: TCP协议是计算机的基础,他本身是一个非常非常复杂的协议. 本文只是蜻蜓点水,将从网络基础以及TCP的相关概念介绍开始,之后再将三次握手,四次挥手这些内容来阐述. 最后介绍一些常见问题,并给出 ...
随机推荐
- ubuntu使用postfix和AWS-SES发送邮件
在日常开发中,邮件发送是个比较常见的场景.因此出现了很多相关的软件和服务,各大云厂商也推出自己的邮件服务.今天笔者就像大家介绍一种常见的组合,AWS的邮件服务 SES 与邮件服务器 postfix 的 ...
- 2.2 追求并发的极致-线程概论 -《zobolの操作系统学习札记》
2.2 追求并发的极致-线程概论 为了追求程序运行之间的并发性,计算机科学家们发明了进程.为了进一步的追求进程内部的并发性,工程师们又提出了线程. 正是线程的出现,给予了程序员更多地操纵OS的自由,可 ...
- BUUCTF-小明的保险箱
小明的保险箱 16进制打开可以发现存在一个RAR压缩包,压缩包里面应该就是flag文本 使用ARCHPR破解即可
- 《Java编程思想》学习笔记_多态
多态 多态指一个行为产生多种状态,针对父类类型可接收其子类类型,最终执行的状态由具体子类确定,其不同子类可呈现出不同状态.例如人[父类]都会跑步[行为],但小孩[子类]跑步.成年人[子类]跑步.运动员 ...
- 【黑马pink老师的H5/CSS课程】(一)基本介绍
视频P4~P6 黑马程序员pink老师前端入门教程,零基础必看的h5(html5)+css3+移动 1.网页 1.1 什么是网页 网站是网页的集合,网页是构成网站的基本元素,常用html格式文件 1. ...
- 一文详解|Go 分布式链路追踪实现原理
在分布式.微服务架构下,应用一个请求往往贯穿多个分布式服务,这给应用的故障排查.性能优化带来新的挑战.分布式链路追踪作为解决分布式应用可观测问题的重要技术,愈发成为分布式应用不可缺少的基础设施.本文将 ...
- 测试右移:线上质量监控 ELK 实战
目录 [测试右移]介绍 ELK Stack 介绍 ELK 监控体系搭建 ES & Kibana 搭建 Nginx 日志自动采集 Nginx Agent 安装 Nginx 服务器 数据分析 Lo ...
- CSS基本知识点——带你走进CSS的新世界
CSS基本知识点 我们在学习HTML之后,前端三件套第二件便是CSS,但CSS内容较多,我们分几部分讲解: (如果没有学习HTML,请参考之前文章:HTML知识点概括--一篇文章带你完全掌握HTML& ...
- Taurus.MVC 如何升级并运行在NET6、NET7
前言: 之前计划帮某公司架构一个从WPF转向Web的低代码的开发平台,并构思为Taurus.MVC 新增微服务的基础功能模块,提供便捷的微服务开发方式,因中途合作中止,代码开发部分后续再上. 最近看到 ...
- 图片系列(6)不同版本上 Bitmap 内存分配与回收原理对比
请点赞关注,你的支持对我意义重大. Hi,我是小彭.本文已收录到 GitHub · AndroidFamily 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注公众号 [彭旭锐] ...