传输协议TCP-原理部分

传输控制协议TCP(Transmission Control Protocol)一种基于连接可靠稳定无重复的传输协议。

1、TCP头部信息

TCP协议头部信息如下:

一共占用20个字节

  • 16位源端口号:发送进程的主机端口
  • 16位目的端口号:接收主机中进程的端口号
  • 32为的序列号:每个包中都包含序列号,序列号被系统初始化为某个随机值ISN。后续的TCP报文段中的序列号应该加上改报文段所携带数据的第一个字节在整个字节流中的偏移。此处的报文段可以理解为字节流的一段数据包
  • 32位的确认号:目的主机返回确认号,使源主机知道某个或者几个报文段已被接收
  • 四位首部长度:由于TCP内包含一个长度可变的选项部分所以需要一个值来指定这个TCP报文段到底多长
  • URG标志:
  • ACK标志:表示确认号是否有效,携带ACK标识的TCP报文段位确认报文段
  • PSH标志:
  • RET标志:
  • SYN标志:表示建立请求连接。携带SYN标识的TCP报文段位同步报文段
  • FIN标志:标识通知对方本端要关闭连接了。携带FIN标识的TCP报文段位结束报文段
  • 16位窗口大小:是TCP流量控制的一个手段。这里说的窗口指的是接受通告窗口。他告诉对方本端的TCP接收缓冲区还能容纳多少个字节的数据,这样对方就可以控制发送数据的速度。
  • 16位校验和:
  • 16位紧急指针:
  • TCP头部选项:

2、TCP传输连接阶段

  • 建立TCP连接(三次握手)
  • 数据转送
  • 释放TCP连接

概念区分:

三报文握手 == 三次握手/三路握手

四报文挥手 == 四次挥手/四路握手

3、TCP连接的建立

        TCP建立连接需要解决三个问题:

  1. 双方能够知道对方的存在
  2. 双方能够协商一些参数(最大窗口值、是否使用窗口扩大选项、时间戳、服务质量等等)
  3. 双方能够对运输实体资源(例如:缓存大小、连接表中的项目等)进行分配

三次握手过程:

  • 最初两端的TCP进程都处于关闭状态,客户端的某个进程主动发起TCP连接建立
  • TCP服务其被动等待客户进程的TCP请求,所以TCP进入监听状态
  • TCP客户端向TCP服务器进程发送TCP连接请求报文,并且进入同步已发送状态
  • 请求报文的首部中的同步SYN被设置为1,表明这是一个TCP连接请求报文段,32位序列字段seq被设置了初始值,作为TCP客户端所选择的初始序号。
  • TCP服务器进程接收到TCP连接请求报文段后,如果同意建立连接,则向TCP客户进程发送TCP连接请求确认报文段,并且进入同步已接收状态,该报文段首部中的同步位SYN和确认位ACK都设置为1,表明这是一个TCP连接请求确认报文段。序号字段seq被设置了一个初始值y,作为TCP服务器进进程选择的初始序号,确认号字段ack的值被设置成x+1,表明接收到了TCP客户进程序号为x的报文。
  • TCP客户进程收到TCP连接请求确认报文段后,还要向TCP服务器进程发送一个普通的TCP确认报文段,并且进入连接已建立状态,报文段首部中的确认位ACK设置为1,表明这是一个普通的TCP确认报文段。序列号字段seq设置为x+1,确认号字段ack的值被设置成y+1,表明接收到了TCP服务进程序号为y的报文,TCP服务器进程收到该确认报文段后也进入连接已建立状态

上述文字如此繁琐,可以看下图:

常见面试题:假如TCP连接的监视使用的是两次握手而不是三次可以吗?

  • 假设TCP客户进程发送了一个TCP请求报文段,但是可报文段在网络结点中被长时间滞留,TCP客户采用超时重传机制重发TCP请求报文段并被TCP服务进程接收,TCP服务进程,发送一个TCP连接请求报文段确认报文段,然后TCP服务进程和客户可以进行信息传递,当数据转送完成的时候双方都处于关闭状态。
  • 随后滞留在网络结点中的哪个失效的TCP请求文段,被TCP服务进程接收,TCP服务进程又发送一个TCP服务进程又发送一个TCP连接请求确认报文段,并且进入连接已建立状态,由于TCP客户进程并没有发起新的TCP连接请求,并且已经处于关闭状态了,因此不会理会TCP服务器发送的报文段,但是TCP服务器进程已经进入了连接已建立状态,他认为新的TCP连接已经建立好了,就会一直等待TCP客户进程发来数据,将会浪费TCP服务器主机的很多资源。

所以要TCP连接的建立采用三次握手:

四次挥手过程:

TCP通过四次挥手来释放连接,数据通信传输完成之后TCP双方都可以释放连接

  • 假设由客户主动关闭TCP连接,
  • 客户进程发送连接释放报文段 ,并且进入终止等待1状态 ,该报文段中的首部终止位FIN设置位1,ACK设置为1,表明这是一个连接释放报文段,同时也对之前接收的报文段进行确认, seq=u表示TCP客户进程之前已发送过的数据的最后一个字节的序号+1,ack=v表示客户进程之前已收到的数据的最后一个字节的序号+1。
  • 服务器进程接收到TCP连接释放报文段后,会发送一个普通的TCP确认报文段并且进入关闭等待状态,此时TCP客户进程到服务器进程这个方向的连接就释放了,这时的TCP连接属于半关闭状态, 也就是TCP客户进程已经没有数据要发送了,但是TCP服务器进程如果还有数据需要发送,客户进程则还需要接收,这个状态可能会持续一段时间,直到TCP服务器进程将数据发送完毕。
  • TCP客户进程收到TCP确认报文段后就进入终止等待2状态,等待TCP服务器进程发出的TCP连接释放报文段。
  • 当TCP服务器进程的没有数据要发送了后,释放连接(被动关闭), FIN=1,ACK=1表明这是一个连接释放报文段,seq=w,ack=u+1同时也对之前收到的报文段进行确认。
  • TCP客户进程收到TCP连接释放报文段后,必须针对该报文段发送普通的TCP确认报文段,之后进入时间等待状态。
  • TCP服务器进程收到该报文段后就进入关闭状态。

  • 而TCP客户进程还需要经过2MSL后才能进入关闭状态。MSL(Maximum Segment Lifetime)意思是最长报文段寿命,RFC793建议为2分钟

这个等待2MSL是为了保证普通的TCP确认报文段能够被TCP服务端接收到。

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

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

相关文章

实现Dropdown下拉菜单监听键盘上下键选中功能-React

用过ant design的小伙伴都知道,select组件是支持联想搜索跟上下键选中的效果的,但是在项目中我们可能会遇到用select组件无法实现我们的需求的情况,比如说一个div框,里面有input,又有tag标签,在input中输入…

探究 Cosmos Hub 作为国家行为者的可能性

原文标题:《Cosmos Hub: The First Democratic State of Capital》 撰文:Vittecoq Quentin,University of Toulon 编译:Tia,Techub News 本文来源香港Web3媒体:Techub News 介绍 让-雅克卢梭曾断言&am…

LAMP网络服务架构

目录 LAMP 网站服务架构 LAMP的组成部分 LAMP的构建顺序 安装论坛 0.电脑已编译安装Apache,MySQL,PHP 1.创建数据库,并进行授权 2.上传论坛压缩包到 /opt ,并解压 3.上传站点更新包 4.更改论坛目录的属主 5.浏览器访问验证 LAMP 网…

【第4章】SpringBoot实战篇之登录优化(含redis使用)

文章目录 前言一、整合redis1. 引入库2. 配置 二、登录优化1.登录2.拦截器3. 登出4. 修改密码 总结 前言 上一章的登录接口,我们将用户登录信息放置于Map中,存在一个问题,集群部署无法共享以及应用停止用户登录信息即丢失,接下来我们整合redis来整合这个问题。 一、整合redis …

代码随想录35期Day59-JavaScript(day58休息)

Day59题目 LeetCode503下一个更大元素 核心思想:和之前的下一个更高温度差不多,使用单调栈,只不过这个需要你循环查找,可以通过遍历两次数组实现 /*** param {number[]} nums* return {number[]}*/ var nextGreaterElements function(nums) {var len nums.lengthvar res …

低代码平台:打破数据孤岛的利器,推动企业数字化转型

随着数字化浪潮的汹涌而至,企业对于快速开发应用程序的需求变得日益迫切。在这样一个快速变化的时代,如何能够高效地开发并上线新的应用程序,以满足市场和客户的不断变化的需求,成为了企业面临的一大挑战。而低代码开发平台&#…

RSA密钥生成、加解密代码

背景介绍 RSA公钥加密算法是1977年由罗纳德李维斯特(Ron Rivest)、阿迪萨莫尔(Adi Shamir)和伦纳德阿德曼(Leonard Adleman)一起提出的。1987年首次公布,当时他们三人都在麻省理工学院工作。RSA…

强化学习(一) 基本概念和赌博机问题

文章目录 什么是强化学习强化学习的两个基本特征强化学习的其它特征强化学习不同于有监督学习强化学习不同于无监督学习强化学习不同于进化方法强化学习的独特挑战强化学习典例 强化学习的要素强化学习的适用范围强化学习学术主线解决强化学习问题的一般框架赌博机两个影响因素…

SiT : Self-supervised vision Transformer

从NLP Transformer中借鉴而来的视觉 Transformer 在使用大规模监督数据或某种形式的协同监督(例如教师网络)进行预训练时已被证明是有效的。这些经过监督预训练的视觉Transformer在下游任务中通过最小的改动就能取得出色的结果。 随着监督预训练&#x…

告别盲目推广!Xinstall二维码携参技术,让App运营更精准高效

在移动互联网时代,App推广和运营已成为每个开发者必须面对的重要任务。然而,如何精准地定位目标用户,提高转化率和用户留存率,成为了摆在每个开发者面前的难题。今天,我们就来谈谈如何通过Xinstall二维码携参技术&…

AzSubEnum:针对Azure服务的子域名枚举查询工具

关于AzSubEnum AzSubEnum是一款专门为Azure服务量身定制的子域名枚举查询工具,该工具旨在帮助广大研究人员仔细搜索和识别与各种Azure服务相关的子域名信息。 通过结合查询技术和语句,AzSubEnum能够深入分析Azure的域名架构,并系统地探测和收…

Python使用trule库画小猪佩奇

在这篇博客中,我将向大家展示如何使用Python的Turtle模块来绘制一个可爱的小猪佩奇。这个项目不仅可以帮助你熟悉Turtle绘图,还可以让你在编程的过程中享受到绘画的乐趣。 并非百分百原创,有部分参考其他博主,请理性对待&#xff…

小学数学出题器-Word插件-大珩助手

Word大珩助手是一款功能丰富的Office Word插件,旨在提高用户在处理文档时的效率。它具有多种实用的功能,能够帮助用户轻松修改、优化和管理Word文件,从而打造出专业而精美的文档。 【新功能】小学数学出题器 1、实现了难度设定;…

Vue.js 中的登录状态管理:使用计算属性避免重复登录20240531

Vue.js 中的登录状态管理:使用计算属性避免重复登录 在前端开发中,用户的登录状态管理是一个非常常见的需求。我们希望用户在成功登录后,即使刷新页面,也能够保持登录状态,而不需要再次登录。在 Vue.js 中&#xff0c…

MySQL之创建高性能的索引(九)

创建高性能的索引 使用索引扫描来做排序 MySQL有两种方式可以生成有序的结果:通过排序操作;或者按索引顺序扫描(MySQL有两种排序算法);如果EXPLAIN出来的type列的值为"index",则说明使用了索引扫描来做排序(不要和Extra列的"…

怎么控制员工电脑的文件外发,六个控制文件外发的小窍门你必须了解

控制员工电脑的文件外发是企业信息安全管理中的重要环节,旨在防止敏感数据泄露、保护知识产权和维护商业秘密。 企业可以通过多种技术和管理措施相结合的方式来达到这一目的,确保既有效控制文件外发风险,又不影响正常的业务运作和员工工作效…

排序题目:删除某些元素后的数组均值

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题:删除某些元素后的数组均值 出处:1619. 删除某些元素后的数组均值 难度 2 级 题目描述 要求 给定一个整数数组 arr \texttt{arr} arr&…

文献阅读:GCNG:用于从空间转录组数据推断基因相互作用的图卷积网络

文献介绍 「文献题目」 GCNG: graph convolutional networks for inferring gene interaction from spatial transcriptomics data 「研究团队」 Ziv Bar-Joseph(美国卡内基梅隆大学) 「发表时间」 2020-12-10 「发表期刊」 Genome Biology 「影响因子…

python 贪心算法(Greedy Algo)

贪婪是一种算法范式,它逐步构建解决方案,始终选择提供最明显和直接收益的下一个部分。贪婪算法用于解决优化问题。 如果问题具有以下属性,则可以使用贪心法解决优化问题: 每一步,我们都可以做出当前看来最好的选择&…

Python模块之Pandas(三)-- DataFrame 查看形状和部分数据

查看数据框的形状: import pandas as pd data pd.read_csv("D:/my_data/data1.csv")print(data的形状为:, data.shape) 查看数据前10行: data.head(10) #查看数据前10行 查看数据后10行: data.tail(10) 查看数据某几列/某几…