【计算机网络】Tcp详解

文章目录

  • 前言
  • Tcp协议段格式
  • TCP的可靠性
  • 面向字节流
  • 应答机制
  • 超时重传
  • 流量控制
  • 滑动窗口(重要)
  • 拥塞控制
  • 延迟应答
  • 捎带应答
  • 标志位
  • 具体标志位
  • 三次握手
  • 四次挥手
  • 粘包问题
  • TCP异常情况
  • listen的第二个参数

前言

前面我们学习了传输层协议Udp,今天我们一起学习Tcp,Tcp比Udp复杂,但可靠,非常多的场景需要这种可靠。

Tcp协议段格式

在这里插入图片描述

只从格式来看,Tcp就比Udp复杂许多,那么Tcp的报头和有效载荷应当如何分离?

首先,报头前20个字节一定是固定的,我们先提取前20个字节,找到4位首部长度
然后,首部长度 * 4 -20,来查看是否有选项
最后,读完选项的字节,剩下的就是数据。

TCP的可靠性

大量丢包,乱序,重复,校验失败,发送缓慢,网络故障,都是不可靠的表现,正是因为传输距离变长,才会引发如此多的可靠性问题,为了解决这些问题。TCP引入了应答进制

假如C给S发送了一条数据,只有当S给C了应答,C才认为自己的数据已经送到了S的手里,如果等待一段时间后没有收到这个应答,C就会认为自己发送的数据丢失了,会触发超时重传。

为了提高发送的效率,多个TCP报文会同步传送,这也就导致到达对端的数据没有顺序,而乱序正是我们要可靠问题,所以TCP报文注定是有编号

面向字节流

应用层将数据拷贝到TCP的发送缓冲区,以 uint8 为一个单位将整个发送缓冲区划分。所以发送缓冲区天然带编号(数组下标)。

应答机制

上面我们知道TCP需要应答和编号,应答其实就是一个TCP报文中携带了ACK字段,而32位序号就是我们所说的编号,对端需要针对这个序号对我们做出ACK应答。

例如:C端发出了32位序号为10的报文,S端就要返回一个32确认编号为11的报文

发送序号:当前报文的编号。
确认序号:表示前面的报文已经全部收到,接下来应该从这个序号开始发送了。

由于Tcp报文具有捎带应答机制,即S发送ACK的时候,也有想要发给C的信息,所以必须设计为两个独立字段,而不能复用在一起。

超时重传

数据丢失的两种可能性:
1、数据半路真的丢包了
2、数据没有丢包,但ACK半路丢了

第一种情况,必然需要我们重传数据,也就要求TCP必须能做到暂时保存这些数据,以支持重传。
第二种情况,可以参考其他的ACK,因为如果只是ACK丢失,其他ACK的确认序号不会变。

等待时间:各个平台不同,在linux下以500ms为基准,n*500的方式动态调整。

流量控制

TCP具有接收缓冲区和发送缓冲区,也是全双工的,但只要是缓冲区就有大小,设想一下这样的场景:

C将报文送到了S,但S的接收缓冲区放不下了。在这种情况下,S只能丢弃掉来的报文,并不做应答,过一段时间,C会进行重传操作。

仔细一下就会发现这样是十分低效的,报文千里迢迢赶到对端主机,却因为对端没法接收而被丢弃,为了解决这个问题,TCP报文有一个叫做16位窗口大小的字段,这个字段填充自己的接收缓冲区的大小,对方拿到报文时就会看到这个大小,并根据此大小调整(增大或减小)发送数据的速度、大小。

窗口探测:
双端会定期向对方发送不携带数据的TCP报文,以此来询问对方的接收能力,调整自己发送数据的速度和大小(这个过程是双向的)

滑动窗口(重要)

TCP协议,可靠性是主要的研究问题,但效率问题,也是TCP需要考虑的问题。

发送方并发发送,一定要在对方能够接收的前提条件下,才能进行并发发送。

1、一般情况
在这里插入图片描述

一个发送缓冲区就被滑动窗口划分成了三个区域。

左边的区域:已经发送,且已经确认的数据——可以被覆盖的
中间的区域:可以直接发送(大小限制),但尚未收到应答
右边的区域:尚未发送的数据区域

滑动窗口的大小,应该与与对方的接收能力有关。

1.5、如何理解滑动窗口

字节流

2、特殊情况

1、滑动窗口只能向右,因为左边的数据已经没有了意义

2、变大变小本质是在调整winend,取决于对方的窗口大小,滑动窗口是浮动的

3、变成0,说明对方不能接收数据了(进行窗口探测,窗口通知)

4、应答也要按序到达
应答编号:winstart = seq;
应答窗口大小:winend = winstart + win;

5、丢失问题

a、第一个丢失了
重传补发

b、中间的丢失了
向右滑动,又变成了第一个丢失

c、最后一个丢失
也会变成最左侧丢失

快重传:(高速重发)
当某一个报文丢失,连续收到了三个一样的确认应答后,立马进行重传。

重传的下限:超时重传
重传的上限:快重传

拥塞控制

如果网络出现问题,TCP也进行了策略控制。

同样都是丢包,丢少和丢多也是不一样的,如果一直在丢包,那就是网络的问题。

当大量丢包的时候,发送方的发送策略是 等等再发!!

如果网络出现瘫痪的时候,所有主机再次重传,会让瘫痪的网络更难以恢复,所以我们采用的策略是,如果发现了网络拥塞,要减少发送量。总的来说要符合以下两点要求:

1、保证网络拥塞不能加重
2、在网络恢复有起色时,尽快恢复网络通信

TCP引入了 慢启动 机制:

发生了网络拥塞,发送方要基本得知网络拥塞的严重程度,必须进行网络状态的探测

拥塞窗口
需要对网络状况进行衡量——拥塞窗口

网络状态时变化的,衡量网络健康状态,即拥塞窗口的大小一定是变化的。

因此发送方的滑动窗口 = min(16位窗口大小,网络的拥塞窗口)

拥塞窗口的增长速度是指数级别的,慢启动指的是前期慢,后期增长速度非常快。

1、慢启动有一个阈值
2、当拥塞窗口超过这个阈值后,不再指数增长,而是按线性增长
3、每次超时重发的时候,慢启动阈值(ssthresh)会变成原来的一半,同时拥塞窗口置为1(乘法减少)

延迟应答

立即返回ACK应答,返回的窗口大小可能会比较小。

给对方通告出更大的win大小,对方就能在更大概率上提高传送效率。给上层更多时间来读取,在这段时间尽快读取,且读取更多。

捎带应答

ACK搭顺风车。

标志位

  • 标志位的本质

一个二进制位,来标识不同类型的报文

  • 为什么要有标志位

不同的标志位提供不同的服务。

具体标志位

ACK:确认应答报文,可能携带数据(捎带应答)
SYN:连接请求的报文(三次握手)
FIN:连接断开的报文(四次挥手)
PSH:提示对方应用层尽快将缓冲区数据取走(多路转接
RST:告诉对方要重新连接(连接被重置了)
URG:按序到达,但我们想插队?(紧急数据)16位紧急指针,紧急数据在有效载荷中的偏移量。紧急数据(带外数据)只有一个字节。(下载取消案例)recvfrom的MSG_OOB选项。

三次握手

在这里插入图片描述

  • 1、什么是连接?
    一个OS内一定右多个建立好的连接,OS必须要把这些连接管理起来。
    维护连接是有成本的,必然要消耗CPU、内存资源。

  • 2、为什么是三次?
    三次握手过程,由双方操作系统在TCP自主完成
    connect:触发连接,等待完成
    accept:等待建立完成,获取连接

    对于客户端来说,只要发出了最后一个ACK,就认为链接已经建立好了。
    对于服务端来说,只有收到了最后一个ACK,服务器才消耗资源构建。

    因此,三次握手本质在赌服务端的确收到了最后一个ACK。假如没有收到ACK,两者建立认知不一致了,这时候客户端再给服务端发消息,服务端就会回复一个RST,进行连接重置

    • 如果两次握手,只要发出SYN+ACK就得浪费资源构建。容易被SYN洪水攻击。注意,TCP本身并不考虑解决安全问题,但TCP不能出现安全漏洞!因此需要规避SYN洪水。
    • 如果大于3次握手,仍然解决不了最后一个ACK问题,如果是偶数次握手,最后一个ACK是服务器端承担风险、奇数次握手是客户端承受风险。而服务器端保存着大量的数据,出现异常是必然的,固而两次以及偶数握手是不妥的
    • 3次握手的好处:
      1、没有明显漏洞,出现异常,成本嫁接到客户端
      2、验证双方通信信道通畅情况,是验证流畅(全双工)的最小成本(收、发)
  • 3、状态变化
    SYN_SENT:同步发送
    SYN_RCVD:同步收到
    ESTABLiSH:建立完成

四次挥手

在这里插入图片描述
四次挥手,是双方建立连接断开共识的最小成本!必须要双方同意(都不发消息)!

状态变化:

当客户端退出,服务器端不调用close的时候,服务端进入CLOSE_WAIT状态,服务端进入FIN_WAIT2的状态。

在这里插入图片描述

一段时间后,客户端的FIN_WAIT2消失,服务端仍是CLOSE_WAIT状态。所以,对于服务器端,要关掉文件描述符!

调用close后,服务器端立马进入LAST_ACK状态,并发送FIN给对端,如果对端已经关闭,在经历几次重传后,服务器端也会断开连接。

主动断开的一方,要进入TIME_WAIT状态,此时立马想要重启,会失败,原因是底层连接还在,正处于TIME_WAIT状态。

  • 1、为什么要进入TIME_WAIT

    TCP协议规定,主动断开连接的一方,要等待两个MSL时间(一个报文在网络里存在的最大时间),

    • 1、让网络中的报文尽快消散,防止对新的连接产生影响。
    • 2、保证最后一个ACK让对方收到。对方如果没收到最后一个ACK,会再发送FIN。
  • 2、如果server不想等待

    //设置地址可以复用,令服务器立马重启
    setsockopt(int sockfd,int level,int optname,const void* optval,socklen_t optlen)
    参数:
    sockfd:套接字
    level:当前在哪一层(SOL_SOCKET)
    optname:(SO_REUSEADDR | SO_REUSEPORT)
    optval:1
    optlen:len
    

粘包问题

TCP没有UDP里面的报文长度字段,我们并不知道两个数据的边界,这样的问题就是粘包问题

解决:明确两个包之间的边界(上层去完成)。

TCP异常情况

进程终止/机器重启:进程终止会释放文件描述符,仍然发送FIN,和正常关闭一样(操作系统回收所有相关资源)

机器掉电/网线断开:对端认为连接还在,一旦接收端有写入操作,发现连接不在了,就会reset,服务器发送保活定时器,发送端也可reset

listen的第二个参数

设置第二个参数为1,连接服务器,一定程度后,进入SYN_RECV,即已经建立好的链接只能是两个。

TCP协议,需要在底层维护全连接队列,最大长度为:第二个参数 + 1

将没有连接到半连接队列,时间非常断。

全连接队列不能太长,也不能没有。全连接的长度不是服务器处理的长度,而是一个 “排队” 的地方.

1、会消耗过多的OS资源,不如给server使用
2、尾部等待太长。

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

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

相关文章

使用FFmpeg+ubuntu系统转化flac无损音频为mp3

功能需求如上题,我们来具体的操作一下: 1.先在ubuntu上面安装FFmpeg:sudo apt install ffmpeg 2.进入有flac音频文件的目录使用下述命令: ffmpeg -i test.FLAC -c:a libmp3lame -q:a 2 output.mp3 3.如果没有什么意外的话,你就能看到你的文件夹里面已经有转化好的mp3文件了 批…

ubuntu中如何用docker下载华为opengauss数据库(超简单)

ubuntu中如何下载华为opengauss数据库 前言一、安装docker1.方法一:2.方法二 二、拉取openguass镜像三、创建容器四、连接数据库 ,切换到omm用户 ,用gsql连接到数据库五.最后用DateGrip远程连接测试(1)选择数据源(2)查看虚拟机ip地…

#循循渐进学51单片机#定时器与数码管#not.4

1、熟练掌握单片机定时器的原理和应用方法。 1)时钟周期:单片机时序中的最小单位,具体计算的方法就是时钟源分之一。 2)机器周期:我们的单片机完成一个操作的最短时间。 3)定时器:打开定时器“储存寄存器…

Python提取JSON数据中的键值对并保存为.csv文件

本文介绍基于Python,读取JSON文件数据,并将JSON文件中指定的键值对数据转换为.csv格式文件的方法。 在之前的文章Python提取JSON文件中的指定数据并保存在CSV或Excel表格文件内(https://blog.csdn.net/zhebushibiaoshifu/article/details/132…

Windows PostgreSql 创建多个数据库目录

1 使用默认用户Administrator 1.1初始化数据库目录 E:\Program Files\PostgreSQL\13> .\bin\initdb -D G:\DATA\pgsql\data3 -W -A md5 1.2连接数据库 这时User为Administrator,密码就是你刚才设置的,我设置的为123456,方便测试。 2 添加…

黑马JVM总结(九)

(1)StringTable_调优1 我们知道StringTable底层是一个哈希表,哈希表的性能是跟它的大小相关的,如果哈希表这个桶的个数比较多,元素相对分散,哈希碰撞的几率就会减少,查找的速度较快&#xff0c…

【微服务】六. Nacos配置管理

6.1 Nacos实现配置管理 配置更改热更新 在nacos左侧新建配置管理 Data ID:就是配置文件名称 一般命名规则:服务名称-环境名称.yaml 配置内容填写:需要热更新需求的配置 配置文件的id:[服务名称]-[profile].[后缀名] 分组&#…

Vuex详解:Vue.js的状态管理方案

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

启动微服务,提示驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接

说明:启动一些微服务后,一直在报下面这个错误; com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not acc…

uniapp抽取组件绑定事件中箭头函数含花括号无法解析

版本: "dcloudio/uni-ui": "^1.4.27", "vue": "> 2.6.14 < 2.7"... 箭头函数后含有花括号的时候, getData就拿不到val参数 , 解决办法就是去除花括号 // 错误代码: <SearchComp change"(val) > { getData({ val …

跨域问题解决方案(三种)

Same Origin Policy同源策略&#xff08;SOP&#xff09; 具有相同的Origin&#xff0c;也即是拥有相同的协议、主机地址以及端口。一旦这三项数据中有一项不同&#xff0c;那么该资源就将被认为是从不同的Origin得来的&#xff0c;进而不被允许访问。 Cross-origin resource…

Jsoup | Document | HTML解析器

Jsoup 一、获取 <p>标签下的所有图片 一、获取 <p>标签下的所有图片 <p> <img style"max-width: 100%;" src"http://image.svipjf.cn/1678271098160-480_01.jpg"/><img src"http://image.svipjf.cn/1678271097994-480_02…

睿趣科技:现在开抖音小店还来得及吗

抖音&#xff0c;作为一款风靡全球的社交短视频应用&#xff0c;已经在短短几年内改变了人们的生活方式和商业模式。随着抖音上涌现出越来越多的网红和小店&#xff0c;许多人开始考虑是否还有机会在这个领域创业。那么&#xff0c;现在开抖音小店还来得及吗? 首先&#xff0c…

编程获取图像中的圆半径

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 即将推出EmguCV的教程&#xff0c;请大家还稍作等待。 之前网友咨询如何获得图像中圆形的半径&#xff0c;其中有两个十字作为标定…

(9.8-9.14)【大数据新闻速递】

加gzh“大数据食铁兽”&#xff0c;了解更多大数据快讯 【2023百度十大科技前沿发明】 近日&#xff0c;百度发布了“2023百度十大科技前沿发明”&#xff0c;包括“基于大模型的检索生成决策交互一体的智能系统”“基于大模型的端到端搜索技术”“飞桨端到端自适应的分布式训…

JL653—一个基于ARINC653的应用程序仿真调试工具

JL653是安装在PC机Windows操作系统上面的一层接插件&#xff0c;它能够真实地模拟ARINC653标准规定的功能性行为&#xff0c;从而可以供研发人员在PC机Windows环境下高效、快速的进行基于ARINC653的应用程序的开发、调试等。 JL653提供了ARINC 653 Part 1中要求的以下服务&…

使用cpolar配合Plex打造个人媒体站,畅享私人影音娱乐空间

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频&#xff0c;已经算是生活中稀松平常的场景了&#xff0c;特别是各…

OGAI详解:AIStation调度平台如何实现大模型高效长时间持续训练

大模型是当前通用人工智能产业发展创新的核心技术&#xff0c;目前国内已发布的生成式AI模型超过了100个。面向以大模型为核心的生成式AI开发与应用场景&#xff0c;近日浪潮信息发布了大模型智算软件栈OGAI&#xff08;Open GenAI Infra&#xff09;——“元脑生智”&#xff…

华为云创新中心黑湖科技:将智能制造进行到底

编辑&#xff1a;阿冒 设计&#xff1a;沐由 一如去年&#xff0c;第二届828 B2B企业节从8月28日-9月15日期间&#xff0c;再一次成为广大企业界关注的焦点。 当前&#xff0c;数字技术已经被广泛被融入到产品、服务与流程当中&#xff0c;用以转变客户的业务成果&#xff0c;以…

ChatGPT在职业规划中的智能助手

随着科技的不断发展&#xff0c;人工智能&#xff08;AI&#xff09;正逐渐成为我们日常生活的一部分。ChatGPT作为一种智能语言模型&#xff0c;可以在职业规划中充当智能助手的角色。本文将探讨ChatGPT在职业规划中的应用&#xff0c;以及它如何成为未来工作的智能伙伴。 首先…