[Linux]经典面试题 - 网络基础 - TCP三次握手
2024-08-28 04:30:11
[Linux]经典面试题 - 网络基础 - TCP三次握手
目录
参考:
一、TCP报文格式
1.1 TCP报头
TCP的报头有20字节,一共160位,其中包括以下内容:
- 源端口号(16位):发起连接端口。
- 目的端口号(16位):接受连接端口。
- 序列号(seq,32位):
- 如果含有同步化旗标(SYN),则此为最初的序列号;第一个资料比特的序列码为本序列号加一。
- 如果没有同步化旗标(SYN),则此为第一个资料比特的序列码。
- 确认号(ack,32位):仅当ACK标志为1时有效,确认号表示期望收到的下一个字节的序号。
- 资料偏移(4位):以4字节为单位计算出的数据段开始地址的偏移值。
- 保留(6位):置零。
- 标识符(6位):
- URG:1,紧急指针字段有效。
- ACK:1,确认号字段有效。
- PSH:1,接收方应尽快将报文交给引用层。
- RST:1,出现严重差错,可能要重新创建TCP请求。
- SYN:1,表示这是连接请求或是连接接受请求,用于创建连接和使顺序号同步。
- FIN:1,表示发送方没有数据要传输了,要求释放连接。
- 窗口(window,16位):表示从确认号开始,本报文的发送方可以接收的字节数,即接受窗口
的大小,用于流量控制。 - 校验和(checksum,16位):对整个的TCP报文段,包括TCP头部和TCP数据,以16位字进行计算所得。这是一个强制性的字段。
- 紧急指针(16位):本报文段中的紧急数据的最后一个字节的序号。
1.2 报文图例
二、TCP三次握手
2.1 运作方式
TCP协议的运行可以分为三个阶段:连接建立、数据传送、连接中止。
操作系统将TCP连接抽象为套接字表示的本地端点,作为编程接口给程序用。
一对终端同时初始化一个它们之间的连接是可能的。但通常是由一端(服务器端)打开一个套接字(socket)然后监听来自另一方(客户端)的连接,这就是通常所指的被动打开。服务器端被被动打开以后,客户端就能开始创建主动打开。
服务器端执行了listen函数后,就在服务器上创建起两个队列:
- SYN队列:存放完成了二次握手的结果。
- ACCEPT队列:存放完成了三次握手的结果。
2.2 建立过程
为了保证数据能够到达目标,TCP采用三次握手的策略,过程如下:
- 客户端向服务端发送一个SYN包,请求一个主动打开。该包携带客户端为这个连接请求而设定的随机数A作为消息序列号。
- 服务端收到一个合法的SYN包后,把该包放入SYN队列中;回送一个SYN/ACK。ACK的确认码应为A+1,SYN/ACK包本身携带一个随机产生的序列号B。
- 客户端收到SYN/ACK包后,发送一个ACK包,该包的序号被设定为A+1,而ACK的确认码为B+1。
2.3 抓包分析
(待补充)
三、TCP四次挥手
3.1 断开过程
断开过程如下:
- 主动断开方(客户端/服务端)-发送一个 FIN,用来关闭主动断开方(客户端/服务端)到被动断开方(客户端/服务端)的数据传送
- 被动断开方(客户端/服务端)-收到这个 FIN,它发回一 个 ACK,确认序号为收到的序号加1 。和 SYN 一样,一个 FIN 将占用一个序号
- 被动点开方(客户端/服务端)-关闭与主动断开方(客户端/服务端)的连接,发送一个FIN给主动断开方(客户端/服务端)
- 主动断开方(客户端/服务端)-发回 ACK 报文确认,并将确认序号设置为收到序号加1
最新文章
- [LeetCode] Minimum Moves to Equal Array Elements 最少移动次数使数组元素相等
- js复制
- (转)sql的join图解
- js024-最佳实践
- TCP UDP 协议的区别和联系
- Linux按键驱动程序设计--从简单到不简单【转】
- nginx,php相关
- IOS常用的系统文件目录介绍
- PyQt 学习笔记1——自定义窗口框架
- 在ubuntu下真机调试android程序出现设备没有访问权限
- [SQL基础教程] 3-4 对查询结果进行排序/ORDER BY
- 一个简单的Java集合范围过滤的多个方式对比
- Intellij Idea配置说明(从Eclipse转Idea)
- (转)log4j(五)——如何控制不同目的地的日志输出?
- 转:IT巨头纷纷“卡位” 智能语音成人机交互入口必争之地
- MySQL多数据源笔记2-Spring多数据源一主多从读写分离(手写)
- bzoj 2821 作诗 分块
- Publisher/Subscriber
- jdbc实现分页,需要前端传当前页码
- python文件相关