全面解析TCP协议(三次握手、四次挥手,头部报文格式)

简介

TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议,用于在计算机网络中传输数据,它提供了可靠的、有序的、基于字节流的传输,并通过拥塞控制机制来保证网络的稳定性,TCP协议可以保证传输数据的安全,所以应用十分广泛。例如上传文件、下载文件、浏览网页等。

TCP协议在传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过“三次握手”。

TCP的特性

  1. 面向连接:在进行数据传输之前,TCP需要在通信双方建立连接,确保双方都准备好进行数据传输。
  2. 可靠性:TCP通过序列号和确认机制来保证数据的可靠传输。接收方会确认已接收到的数据,并要求发送方重新发送丢失的数据。
  3. 有序性:TCP保证接收到的数据按照发送的顺序进行组装,不会出现乱序的情况。
  4. 流量控制:TCP使用滑动窗口机制来控制数据的发送速率,确保发送方不会压倒接收方。
  5. 拥塞控制:TCP通过拥塞窗口和拥塞避免算法来控制网络拥塞的发生,以保证网络的稳定性和公平性。

TCP三次握手(建立连接)和四次挥手(关闭连接)

三次握手

  1. 第一步:客户端发送SYN

    • 客户端向服务器发送一个带有SYN(同步)标志的数据包。
    • 客户端选择一个初始序列号(ISN)并将其放入TCP头部的序列号字段。
  2. 第二步:服务器回复SYN/ACK

    • 服务器接收到客户端的SYN数据包后,向客户端发送一个带有SYN/ACK标志的数据包。
    • 服务器选择一个自己的初始序列号,并将其放入TCP头部的序列号字段。
    • 服务器还确认客户端的序列号,并将下一个期望接收的序列号放入确认序号字段。
  3. 第三步:客户端发送ACK

    • 客户端接收到服务器的SYN/ACK数据包后,向服务器发送一个带有ACK(确认)标志的数据包。
    • 客户端确认服务器的序列号,并将下一个期望接收的序列号放入确认序号字段。

四次挥手

  1. 第一步:客户端发送FIN

    • 客户端想要关闭连接时,向服务器发送一个带有FIN(结束)标志的数据包。
    • 客户端停止发送数据,但仍然可以接收数据。
  2. 第二步:服务器发送ACK

    • 服务器接收到客户端的FIN数据包后,向客户端发送一个带有ACK标志的数据包,确认收到了客户端的关闭请求。
  3. 第三步:服务器发送FIN

    • 服务器准备关闭连接时,向客户端发送一个带有FIN标志的数据包。
    • 服务器停止发送数据,但仍然可以接收数据。
  4. 第四步:客户端发送ACK

    • 客户端接收到服务器的FIN数据包后,向服务器发送一个带有ACK标志的数据包,确认收到了服务器的关闭请求。
    • 客户端等待一段时间,确保服务器收到了ACK后,关闭连接。

TCP头部格式(基础占用20个字节)

 0               1               2               3	(1 - 4字节,1字节8位)0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 (0 - 31位)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           源端口号(16位)        |     目标端口号(16位)         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        序列号 (32位)                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       确认号 (32位)                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 数据偏移 |保留		| U | A | P | R | S | F |                   |
| (4位)   |(6位)    | R | C | S | S | Y | I |         窗口大小   |
|         |       	| G | K | H | T | N | N |         (16位)    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|              校验和(16位)              |	紧急指针(16位)    	|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 选项(最大40字节) |    填充(0,1,2或3个字节) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  • 解析如下:
  • 源端口号目标端口号:分别指示发送方和接收方的端口号,用于标识应用程序或服务,并确保数据能够正确地传递到目标地址和端口号。
  • 序列号:用于标识发送方发送的数据段中的第一个字节的序列号。接收方通过序列号来组装数据段,保证数据的有序性。
  • 确认号:指示接收方期望接收的下一个字节的序列号。接收方在接收到TCP报文后,会将确认号设置为已经成功接收到的最后一个字节的序列号加1。发送方通过确认号来确认接收方已经成功接收到数据,从而可以继续发送下一个数据段。
  • 数据偏移:指示TCP头部的长度,以4字节为单位。由于TCP头部的长度是可变的,这个字段用于确定数据在TCP报文中的位置。例如,如果数据偏移字段的值为5,表示TCP头部的长度为5 * 4 = 20个字节
  • 保留:保留字段,暂时没有使用。
  • 标志位:控制TCP连接的操作
    • Urg(Urgent): 指示紧急指针字段是否有效。当Urg标志位被设置为1时,表示TCP报文中存在紧急数据,紧急指针字段指示了紧急数据的位置。紧急数据具有高优先级,接收方应立即处理。
    • Ack(Acknowledgment):指示确认号字段是否有效。当Ack标志位被设置为1时,表示确认号字段中包含有效的确认序号,用于确认已经收到的数据。
    • Psh(Push):指示接收方是否应该立即将接收到的数据推送给应用程序,而不是等待缓冲区填满或等待更多数据。当Psh标志位被设置为1时,表示发送方希望接收方立即将数据传递给应用程序。
    • Rst(Reset):重置TCP连接。当Rst标志位被设置为1时,表示要立即终止连接并丢弃所有未处理的数据。通常用于处理连接异常或恢复到初始状态。
    • Syn(Synchronize):建立TCP连接。当Syn标志位被设置为1时,表示发送方希望建立连接,并在序列号字段中包含初始序列号。在连接建立过程中,Syn用于同步双方的初始序列号。
    • Fin(Finish): 结束TCP连接。当Fin标志位被设置为1时,表示发送方不再发送数据,并请求关闭连接。接收方收到Fin后,可以继续发送数据,直到完成后也发送一个Fin来关闭连接。
  • 窗口大小:指示接收方的接收窗口大小,用于流量控制,控制发送方的发送速率。 发送方根据接收方的窗口大小来控制发送数据的速率,以避免发送过多的数据导致接收方无法及时处理。
  • 校验和:用于检测TCP头部和数据的完整性,防止数据在传输过程中被篡改。
  • 紧急指针:指示紧急数据的位置,用于处理紧急数据的传输。
  • 选项:可选字段,用于扩展TCP功能,如选择确认、时间戳等。长最大长度限制为40个字节度超过40个字节,将会被截断或丢弃。
  • 填充:用于填充TCP头部,使其长度为4字节的倍数(比如27填充11字节)。

Java中的TCP通信

  • Java对基于TCP协议的的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信。
  • Java为客户端提供了Socket类,为服务器端提供了ServerSocket类

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

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

相关文章

HTTP长连接实现原理

1. HTTP长连接和短连接的定义 HTTP长连接 浏览器向服务器进行一次HTTP会话访问后,并不会直接关闭这个连接,而是会默认保持一段时间,那么下一次浏览器继续访问的时候就会再次利用到这个连接。在HTTP/1.1版本中,默认的连接都是长连…

JVM面试题:(二)内存结构和内存溢出、方法区的两种实现

内存结构: 方法区和对是所有线程共享的内存区域;而java栈、本地方法栈和程序员计数器是运行是线程私有 的内存区域。 Java堆(Heap),是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内 存区域,在…

VuePress实现自动获取文章侧边栏目录功能

👨🏻‍💻 热爱摄影的程序员 👨🏻‍🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻‍🏫 一位高冷无情的编码爱好者 大家好,我是 DevO…

MFC 鼠标悬停提示框

MFC 鼠标悬停提示框 运行效果 在MFC窗口中添加一个控件 工具栏中拖拽List Box到MFC窗口给List Box添加变量 CListBox m_listbox 增加成员变量 CWnd* m_tip_parent_wnd; CToolTipCtrl m_tip;给m_listbox创建提示框 void create_tip_window(CWnd* tip_wnd, CToolTipCtrl* ti…

从 0 到 1 ,手把手教你编写《消息队列》项目(Java实现) —— 创建虚拟机

文章目录 一、虚拟机二、关于消息的API发布消息直接交换机 DIRECT 转发规则扇出交换机 FANOUT 转发规则主题交换机 TOPIC 转发规则匹配规则Router类 订阅消息消费者队列如何给订阅的消费者发送消息自动发送消息至订阅者 应答消息 三、代码编写 一、虚拟机 接下来要创建虚拟机,…

el-date-picker增加默认值 修改样式

预期效果 默认是这样的 但希望是直接有一个默认的当天日期,并且字体颜色啥的样式也要修改(在这里假设今天是2023/10/6 功能实现 踩了坑挺多坑的,特此记录 官方文档 按照官方的说明,给v-model绑定一个字符串就可以了 在j…

AI能否取代程序员:探讨人工智能在编程领域的角色

引言: 随着人工智能(AI)技术的快速发展,人们开始思考:AI是否能够取代程序员?这个问题引发了广泛的讨论和辩论。一些人认为,AI的出现将彻底改变编程的面貌,而另一些人则坚信&#xf…

2.2 Pthreads是什么

以前硬件供应商一般都会提供相应硬件平台专用的线程库,使得多线程编程的代码的可移植性成为另开发者头疼的一个问题。为了更好地利用线程进行相关开发,制定标准的线程编程接口迫在眉睫,由此Pthreads诞生了。 1995年IEEE POSIX 1003.1c标准制…

大数据之LibrA数据库系统介绍

简介 LibrA是一个基于开源数据库Postgres-XC开发的分布式并行关系型数据库系统。 LibrA提供了以下功能: 标准SQL支持 支持标准的SQL92/SQL2003规范,支持GBK和UTF-8字符集,支持SQL标准函数与OLAP分析函数,支持存储过程。 数据库…

微信支付v2

文档: https://pay.weixin.qq.com/wiki/doc/api/index.html 微信小程序:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter11_1 需要一个微信认证后的小程序,,还需要一个,在微信商户平台,&…

串级/级联控制知识点整理

串级控制系统是改善控制质量的有效方法之一,在过程控制中得到了广泛的应用。所谓串级控制,就是采用两个控制器串联工作,外环控制器的输出作为内环控制器的设定值,由内环控制器的输出去操纵控制阀,从而对外环被控量具有…

mysql8压缩包安装

MySQL 8.0 版压缩包安装教程_mysql 压缩包 8.0安装-CSDN博客 1、mysql压缩包 2、参考链接一步一步操作即可。 3、安装,破解navicat. 4、无法连接,参考该链接修改: Mysql 解决1251- Client does not support authentication protocol reques…

android app开发环境搭建

Android是流行的移动设备原生应用开发平台,其支持Java语言以及Kotlin语言的开发环境,本文主要描述官方提供的Android studio集成开发环境搭建。 https://developer.android.google.cn/ 如上所示,从官方上下载最新版本的Android studio集成开…

【DevOps】搭建你的第一个 Docker 应用栈

搭建你的第一个 Docker 应用栈 1.Docker 集群部署2.第一个 Hello World2.1 获取应用栈各节点所需镜像2.2 应用栈容器节点互联2.3 应用栈容器节点启动2.4 应用栈容器节点的配置2.4.1 Redis Master 主数据库容器节点的配置2.4.2 Redis Slave 从数据库容器节点的配置2.4.3 Redis 数…

[NISACTF 2022]join-us - 报错注入无列名注入

[NISACTF 2022]join-us 解题流程 解题流程 点击登录,找到注入点 这种框,可以直接爆破关键字,看是否拦截,也可以手动尝试,发现、union、and、or、substr、database等关键字都拦截了 1、学到了:可以用数据库…

pytorch学习------TensorBoard的使用

目录 简介使用方式1、单条曲线(scalar)2、多条曲线(scalars)3、直方图(histogram)4、图片(image)5、渲染(figure)6、网络(graph) 简介 建好一个神经网络,其实我们也不知道神经网络里头具体细节到底做了什么,要人工调试十分困难(就好比你无法想象出递归的…

arc 166 a

#include<bits/stdc.h> using namespace std; using VI vector<int>; using ll long long; const int mod 998244353; //当只有ab的时候&#xff0c;看作把a可以向右移动 //1 - x 是a 1 - y a //x中的 a 的 下标 < y 中 a 的下标 //这样就可以通过位移得到 …

SpringCloud之Stream框架集成RocketMQ消息中间件

Spring Cloud Stream 是一个用来为微服务应用构建消息驱动能力的框架。它可以基于 Spring Boot 来创建独立的、可用于生产的 Spring 应用程序。Spring Cloud Stream 为一些供应商的消息中间件产品提供了个性化的自动化配置实现&#xff0c;并引入了发布-订阅、消费组、分区这三…

codesys 控制轴组程序

//轴组使能允许 IF AxisGroupControl.bPower AND NOT AxisGroupStatus.bPowerError THEN bPowerAllow:TRUE; ELSE bPowerAllow:FALSE; END_IF //轴组有效允许 IF AxisGroupControl.bEnable AND NOT AxisGroupControl.bDisable THEN bEnableAllow:TRUE; ELSE b…

SQL Server 简介与 Docker Compose 部署

今天我翻阅了在之前公司工作时的笔记&#xff0c;发现了有关数据库的一些记录。当时&#xff0c;我们的项目开始使用 Oracle 数据库&#xff0c;但后来由于一些项目需求的变更&#xff0c;我们切换到了 SQL Server 。值得一提的是&#xff0c;公司当时也开始采用 Docker 技术&a…