高性能网络编程 - 白话TCP 三次握手过程

文章目录

  • 概述
  • TCP协议头的格式
  • TCP Finite State Machine (FSM) 状态机
  • 三次握手
  • 如何在 Linux 系统中查看 TCP 状态

在这里插入图片描述


概述

在这里插入图片描述

每一个抽象层建立在低一层提供的服务上,并且为高一层提供服务。

我们需要知道

  • TCP在网络OSI的七层模型中的第四层——Transport层 --------------- 第四层的数据叫Segment
  • IP在第三层——Network层 ---------------在第三层上的数据叫Packet
  • ARP在第二层——Data Link层,在第二层上的数据叫Frame

我们程序的数据首先会打到TCP的Segment中,然后TCP的Segment会打到IP的Packet中,然后再打到以太网Ethernet的Frame中,传到对端后,各个层解析自己的协议,然后把数据交给更高层的协议处理。

网络中传输的数据包由两部分组成:

  • 一部分是协议所要用到的首部
  • 另一部分是上一层传过来的数据。

首部的结构由协议的具体规范详细定义。在数据包的首部,明确标明了协议应该如何读取数据。反过来说,看到首部,也就能够了解该协议必要的信息以及所要处理的数据。

在这里插入图片描述

我们用用户 A 发送,用户 B 接受来说说明:

① 用户 A 应用程序处理
首先应用程序会进行编码处理产生报文/消息(message)交给下面的 TCP 层。

② 用户 A TCP 模块的处理
TCP 根据应用的指示,负责建立连接、发送数据以及断开连接。TCP 提供将应用层发来的
数据顺利发送至对端的可靠传输。为了实现这一功能,需要将应用层数据封装为报文段
(segment)并附加一个 TCP 首部
然后交给下面的 IP 层。

③ 用户 A IP 模块的处理
IP 将 TCP 传过来的 TCP 首部和 TCP 数据合起来当做自己的数据,并在 TCP 首部的前端
加上自己的 IP 首部生成 IP 数据报(datagram)然后交给下面的数据链路层。

④ 用户 A 数据链路层的处理
从 IP 传过来的 IP 包对于数据链路层来说就是数据。给这些数据附加上链路层首部封装为
链路层帧(frame),生成的链路层帧(frame)将通过物理层传输给接收端。

⑤ 用户 B 数据链路层的处理
用户 B 主机收到链路层帧(frame)后,首先从链路层帧(frame)首部找到 MAC 地址判断
是否为发送给自己的包,若不是则丢弃数据。
如果是发送给自己的包,则从以太网包首部中的类型确定数据类型,再传给相应的模块,如
IP、ARP 等。这里的例子则是 IP 。

⑥ 用户 B IP 模块的处理
IP 模块接收到 数据后也做类似的处理。从包首部中判断此 IP 地址是否与自己的 IP 地址
匹配,如果匹配则根据首部的协议类型将数据发送给对应的模块,如 TCP、UDP。这里的例
子则是 TCP。

⑦ 用户 B TCP 模块的处理
在 TCP 模块中,首先会计算一下校验和,判断数据是否被破坏。然后检查是否在按照序号
接收数据。最后检查端口号,确定具体的应用程序。数据被完整地接收以后,会传给由端口
号识别的应用程序。

⑧ 用户 B 应用程序的处理
接收端应用程序会直接接收发送端发送的数据。通过解析数据,展示相应的内容。


TCP协议头的格式

在这里插入图片描述

  • 1)TCP的包是没有IP地址的,那是IP层上的事,但是有源端口和目标端口。
  • 2)一个TCP连接需要四个元组来表示是同一个连接(src_ip, src_port, dst_ip, dst_port)准确说是五元组,还有一个是协议。但因为这里只是说TCP协议,所以,这里我们只说四元组。

在这里插入图片描述
注意【TCP协议头】图:

  • 1)Sequence Number:是包的序号,用来解决网络包乱序(reordering)问题。
  • 2)Acknowledgement Number:就是ACK——用于确认收到,用来解决不丢包的问题。
  • 3)Window:又叫Advertised-Window,也就是著名的滑动窗口(Sliding Window),用于解决流控的。
  • 4)TCP Flag :也就是包的类型,主要是用于操控TCP的状态机的。

一般来说,不管计算机中有多少网卡,每个网卡都会有自己的 MAC 地址,这个MAC 地址是不会变化的。而每个网卡在正常工作的情况下,都会有一个 IP 地址,这个 IP地址完全是可以变化的。而这台计算机中承载的各种应用程序可以拥有自己的端口号,然后通过服务器的网卡,正确地进行网络通信。

一台服务器上的不同网络应用程序必须有不同的端口号,A 程序启动了使用了端口 x,B 程序启动就不能使用端口 x,否则会报错“Address already in use”。


总的来说,操作系统是通过源 IP 地址、目标 IP 地址、协议号(协议类型)、源端口号以及目标端口号这五个元素唯一性的识别一个网络上的通信
在这里插入图片描述


TCP Finite State Machine (FSM) 状态机

http://www.tcpipguide.com/free/t_TCPOperationalOverviewandtheTCPFiniteStateMachineF-2.htm

在这里插入图片描述


三次握手

TCP 提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好两端之间的准备工作。

所谓三次握手是指建立一个 TCP 连接时需要客户端和服务器端总共发送三个包以确认连接的建立。

在 socket 编程中,这一过程由客户端执行 connect 来触发,所以网络通信中,发起连接的一方我们称为客户端,接收连接的一方我们称之为服务端

在这里插入图片描述

一开始,客户端和服务端都处于 CLOSE 状态。先是服务端主动监听某个端口,处于 LISTEN 状态

第一次握手:客户端将请求报文标志位 SYN 置为 1,请求报文的 Sequence Number 字段(简称 seq)中填入一个随机值 J,并将该数据包发送给服务器端,客户端进入 SYN_SENT 状态,等待服务器端确认。

客户端会随机初始化序号(client_isn),将此序号置于 TCP 首部的「序号」字段中,同时把 SYN 标志位置为 1,表示 SYN 报文。接着把第一个 SYN 报文发送给服务端,表示向服务端发起连接,该报文不包含应用层数据,之后客户端处于 SYN-SENT 状态

在这里插入图片描述


第二次握手:服务器端收到数据包后由请求报文标志位 SYN=1 知道客户端请求建立连接,服务器端将应答报文标志位 SYNACK 都置为 1,应答报文的 Acknowledgment Number字段(简称 ack)中填入 ack=J+1,应答报文的 seq 中填入一个随机值 K,并将该数据包发送给客户端以确认连接请求,服务器端进入 SYN_RCVD 状态。

服务端收到客户端的 SYN 报文后,首先服务端也随机初始化自己的序号(server_isn),将此序号填入 TCP 首部的「序号」字段中,其次把 TCP 首部的「确认应答号」字段填入 client_isn + 1, 接着把 SYN 和 ACK 标志位置为 1。最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于 SYN-RCVD 状态。


在这里插入图片描述

第三次握手:客户端收到应答报文后,检查 ack 是否为 J+1,ACK 是否为 1,如果正确则将第三个报文标志位 ACK 置为 1,ack=K+1,并将该数据包发送给服务器端,服务器端检查 ack 是否为 K+1,ACK 是否为 1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED 状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。

客户端收到服务端报文后,还要向服务端回应最后一个应答报文,首先该应答报文 TCP 首部 ACK 标志位置为 1 ,其次「确认应答号」字段填入 server_isn + 1 ,最后把报文发送给服务端,这次报文可以携带客户到服务端的数据,之后客户端处于 ESTABLISHED 状态。

服务端收到客户端的应答报文后,也进入 ESTABLISHED 状态。

在这里插入图片描述

从上面的过程可以发现第三次握手是可以携带数据的,前两次握手是不可以携带数据的。

一旦完成三次握手,双方都处于 ESTABLISHED 状态,此时连接就已建立完成,客户端和服务端就可以相互发送数据了。


如何在 Linux 系统中查看 TCP 状态

在 Linux 可以通过 netstat -napt 命令查看

在这里插入图片描述


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/201630.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql源码linux环境部署

文章目录 一、mysql下载地址二、安装步骤1.cd /usr/local/ #切换到此目录下2.上传mysql安装包到该目录下3.解压并且移动文件到 /usr/local/mysql目录下 三、创建用户组,分配权限四、修改文件总结 提示:以下是本篇文章正文内容,下面案例可供参…

对比传统跨网文件交换方式,文件摆渡系统拥有4大优势!

网络隔离已是较为常见的网络安全保护措施,越来越多公司进行隔离网建设来隔绝外部网络有害攻击,但隔离后不少数据和文件仍需进行流转,就产生了跨网数据交换需求,在过去,企业使用较多的传统跨网文件交换方式有移动介质、…

扩散模型实战(十四):扩散模型生成音频

推荐阅读列表: 扩散模型实战(一):基本原理介绍 扩散模型实战(二):扩散模型的发展 扩散模型实战(三):扩散模型的应用 扩散模型实战(四&#xff…

基于MySQL+IDEA+Mybaits开发的OA办公系统

基于MySQLIDEAMybaits开发的OA办公系统 项目介绍💁🏻 本项目是一个基于MySQL、Tomcat和MyBatis开发的OA管理系统。该系统的主要功能包括系统登录主页面、用户管理、部门管理、职位管理及查询、公告管理及查询、签到处理以及签到图表统计等。 在数据库方面…

ROS小练习——话题订阅

目录 一、话题与消息获取 二、代码编写 1、C 2、python 三、编译运行 一、话题与消息获取 rostopic list rostopic type /turtle1/pose rosmsg info turtlesim/Pose 二、代码编写 1、C //包含头文件 #include "ros/ros.h" #include "turtlesim/Pose…

6.游戏通信方案概述

弱联网游戏和强联网游戏 短链接游戏和长连接游戏 Socket、HTTP、FTP 总结 网络游戏的通信方案大体上可以根据游戏的实际情况分为两种: 长链接(强联网)游戏和短链接(弱联网)游戏 网络游戏的三种通信方案: 1.…

uniapp得app云打包问题

获取appid,具体可以查看详情 也可以配置图标,获取直接生成即可 发行 打包配置 自有证书测试使用时候不需要使用 编译打包 最后找到安装包apk安装到手机 打包前,图片命名使用要非中文,否则无法打包成功会报错

【Kubernetes】kubeadm安装k8s1.25.0高可用集群

k8s集群搭建(v1.25.0) 一、初始化实验环境二、安装containerd服务2.1、安装containerd2.2、安装docker2.3、配置镜像加速器三、安装初始化k8s需要的软件包四、kubeadm初始化k8s集群4.1、设置容器运行时4.2、生成并修改配置文件4.2、初始化安装4.3、修改c…

DHCP Host Name

文章目录 前言DHCP OptionOption (12) Host Namednsmasq 前言 打开路由器页面,看到下面连接的设备,有的显示设备名称 Tmall-Genie、ESP-C37CE8,而有的直接显示 MAC 地址 D2:B0:XX:XX:XX:XX。 这个名称是哪里来的呢? 这就是我们今…

Pandas使用过程中的神器加持 你不用不要怪我

Pandas是我们日常处理表格数据最常用的包,但是对于数据分析来说,Pandas的DataFrame还不够直观,所以今天我们将介绍4个和Pandas相关的Python包,可以将Pandas的DataFrame转换交互式表格,让我们可以直接在上面进行数据分析…

2022年南美地区医疗机器人市场及全球概况报告

今天分享的是机器人系列深度研究报告:《2022年南美地区医疗机器人市场及全球概况报告》。 (报告出品方:Apollo Reports) 报告共计:172页 研究方法论 2.1通过桌面研究和内部存储库的假设 a)最初,各个类别…

【动态规划】LeetCode2111:使数组 K 递增的最少操作次数

作者推荐 [二分查找]LeetCode2040:两个有序数组的第 K 小乘积 本文涉及的基础知识点 二分查找算法合集 分组 动态规划 题目 给你一个下标从 0 开始包含 n 个正整数的数组 arr &#xff0c;和一个正整数 k 。 如果对于每个满足 k < i < n-1 的下标 i &#xff0c;都有…

Qt + MySQL(简单的增删改查)

Qt编译MySql插件教程 QSqlDatabase 静态函数 1.drivers()&#xff0c;得到可以使用的数据库驱动名字的集合 [static] QStringList QSqlDatabase::drivers();2.addDatabase()&#xff0c;添加一个数据库实例 [static] QSqlDatabase QSqlDatabase::addDatabase(const QStrin…

ROS小练习——话题发布

目录 一、话题与消息获取 1、话题 2、消息 二、代码编写 1、C 2、python 三、编译运行 一、话题与消息获取 打开小乌龟案例 1、话题 rqt_graph rostopic list 2、消息 获取消息类型: rostopic type /turtle1/cmd_vel 获取消息格式: rosmsg info geometry_msgs/Twi…

PieCloudDB Database 自研全新向量化执行器,带来性能的数量级提升

数据分析和应用的重要性日益增长&#xff0c;对于数据平台和数据计算系统来说&#xff0c;极致的性能是关键需求之一。为实现更高效的数据并行计算&#xff0c;一款优秀的执行器需要能够充分利用硬件资源&#xff0c;如 CPU 的并行计算能力和 SIMD 指令集。此外&#xff0c;优化…

【用unity实现100个游戏之18】从零开始制作一个类CSGO/CS2、CF第一人称FPS射击游戏——基础篇1(附项目源码)

文章目录 本节最终效果前言搭建环境玩家移动控制摄像机跟随和视角人物奔跑实现跳跃斜坡顿挫感人物卡墙问题源码完结 本节最终效果 前言 生存和射击游戏一直是我的最爱&#xff0c;说起3D最普遍的应该就是射击系统了&#xff0c;你可以在任何情况下加入射击功能&#xff0c;所以…

软件工程之架构设计

从公众号转载&#xff0c;关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一、架构设计的目的 1.什么是复杂的软件项目 复杂的软件项目通常有两个特点&#xff1a; 需求不确定 技术复杂 技术的复杂性主要体现在四个方面…

Ubuntu防止休眠和挂起(笔记)

目录 1 动机2 禁用休眠3 解除休眠 1 动机 我要将 饿啊人制作成 noah-mp 的区域运行强迫&#xff0c;但是跑的慢&#xff0c;一晚上两天。后来发现是因为电脑自动 supend 了。Ubuntu 在电源那里最多只能设置 2 小时的防止休眠&#xff0c;2小时候又自动休眠&#xff0c;严重影响…

论在武汉考一个安全员B证能有多难?谁曾想

论在武汉考一个安全员B证能有多难&#xff1f;谁曾想 在武汉考一个安全员B证的考试难度&#xff0c;硬考&#xff08;自己练习系统题库备考&#xff09;还是有一定难度的。毕竟考试范围比较宽泛&#xff0c;里边涉及日常工作内容、法规知识、建筑管理知识等等。即使你考过了二…

AOP记录操作日志

创建数据库表 -- 操作日志 create table operate_log (id int unsigned primary key auto_increment commentid,operate_user int unsigned comment 操作人员Id,operate_time datetime comment 操作时间,class_name varchar(100)comment 操作类,method_name varchar(100)comme…