【网络】TCP协议详解(下)

news2024/12/27 1:49:34

上文介绍了TCP传输控制协议的报头,并且渗透了TCP保证可靠性的策略:如流量控制、按序到达、确认应答机制以及超时重传。本文继续讲解TCP剩下的协议,剩下俩个大话题,难度都比较麻烦。

本文将介绍TCP协议最常见的三次握手和四次挥手、理解为什么需要这样做。另外TCP为了提高效率也做了很多努力,如滑动窗口、延迟应答。另外保证可靠性的另一个措施:拥塞窗口。

三次握手

三次握手的目的是双方可靠的建立连接 。在TCP报文中将标记位SYN设为1。然后向目标服务器发送携带SYN标记位的报文。对端收到报文后,会对报文进行ACK,告知建立连接。

介绍一下这个过程:
以客户端向服务器主动建立连接为例子,讲解一下三次握手。

  1. 客户端会向服务器发送SYN请求建立连接的报文。
  2. 服务器收到报文后要对报文ACK回复,同时服务器也要和客户端建立连接,也要发送SYN建立连接的报文。为了提高效率服务器的SYN+ACK被压缩成一条捎带应答发送给客户端。客户端接收到ACK后,会在OS中创建连接管理,维护连接的属性。同时对服务器进行ACK。
  3. 服务器收到最后一条ACK后,在OS中创建链接管理信息,连接真正的被建立。

 最后一次握手是不可靠的,因为客户端不知道,服务器是否收到ACK报文。但是RST重置位标志保证了双发是可靠的建立链接。

建立一个共识:

建立连接是需要成本的!双方会在内核中开辟结构体,填充相应的字段,比如端口号,序号,缓冲区,窗口大小等。建立连接后,上层调用accept获取文件描述符,将对应的读/写通道提供给上层。所以处于connection没有accpet是不影响的。

常见的问题

为什么要进行三次握手?

本文将从三个角度讲讲为什么需要三次握手?以客户端主动连接服务器为例。


1.最小成本的验证全双工。因为tcp是全双工的,可读可写。

第一次握手表明客户端就有发的能力,并且等待服务器的确认。第二次握手,服务器确认客户端消息,并且表明自己有收和发的能力。第三次客户端确认收到服务器的ack+syn,知道客户端有收的能力。至此客户端和服务器都确认了双发就有收数据和发数据的能力。

2.奇数次握手,客户端会优先建立链接,维护结构体等等。而服务器只有在收到客户端的ack之后,才建立链接。避免了单机程序,恶意发起连接建立引发syn洪水。

3.保证100%可靠的收到建立连接的请求。三次握手本质是四次握手。三次握手当中,有一次是syn+ack是捎带应答。如果将syn + ack拆开的话。就单看俩个朝向上。客户端syn被可靠的接收,另一端 服务器的syn 也被可靠的得知,所以建立连接是可靠的。


四次挥手

四次挥手的目的是断开连接。客户端向服务器发起FIN(结束连接)TCP报文。服务器收到FIN请求后进入WAIT_CLOSE状态,并且向客户端发送ack报文。一般发送完ACK之后,再发送FIN请求断开连接的TCP报文。客户端收到服务器的FIN报文发送ACK报文后进入TIME_WAIT状态。

 为什么不能是三次挥手呢?
客户端主动发起FIN,代表客户端不会给服务器发消息了。C->S朝上是关闭的,而S->C上的朝向是开着的。服务器收到FIN时,可能还有数据需要发送给客户端,短暂的延迟后,才关闭S->C的通道,是为了让客户端将剩余的数据收完。

 TIMEWAIT(等待状态)

主动断开连接的一方会进入TIME_WAIT状态。进入TIME_WAIT状态,连接并不会被彻底释放掉,会保留一段时间,也就导致地址和端口被占用。

存在的意义:

1.最后一次ack丢失,需要重复给服务器

2.网络中可能由于阻塞,存在尚未发送完全的报文。如果立马消失,就会导致上一次没法完的数据,影响新连接。所以一般都要等待旧报文消失。

存在的时间:

2*MSL:报文在网络中存在的时间的2倍。

一般一个MSL是60秒

如何保证旧报文不会影响新连接呢?
策略1:TIME_WAIT延时

策略2:随机一个起始序号


滑动窗口

为了保障效率,TCP允许并发发送大量暂时不需要ack的报文。那么要发多少数据是由对方的接收缓冲区决定的,也就和上文的流量控制有关系,那么要如果控制呢?这就要学习本文的滑动窗口

可以将发送缓冲区想象成一个char 类型的数组,数组中天然的就有下标。

滑动窗口是什么?

在发送缓冲区中,维护了start和end指针,start指针和end指针所包含的区域就是滑动窗口。

滑动窗口的大小是有对方接收能力大小约定的。

粗略的更新规则:

  • start=确认序号。
  • end=确认序号+对方窗口大小。

来自图解TCP/IP的经典图画

主机A发送序号为2000的报文,主机B确认并且告知窗口大小是4000

那么start=2001,end=2001+4000=6001

但是这样解释并不全面。下面更深刻的理解一下滑动窗口

 建立一个共识:

将缓冲区的数据根据滑动窗口划分成三部分,最左边的以及发送,以及ack的数据。中间的可发送的数据。

数据2000-5000的数据被并发发出去。会出现这几种情况

1.最左端的报文丢失:2000的报文丢失/ack丢失、

那么就需要重新发送报文。报文该如何发呢?

如果2000报文丢失,3000、4000、5000正常收到。那么确认序号是多少i?是1001,因为确认序号表示,之前的数据被全部收到。

会发送四条1001的ack给主机A,主机A收到连续三条相同的报文后,会进行重发最左端的报文。

真正收到2001ACK后就会滑动窗口

2.中间丢失呢?

中间丢失会转化为最左端的数据丢失,如果3000丢失,会收到2001ack。重发3000

3.最右报文丢失呢?也会转化会最左端丢失。

如何知道起始的窗口大小?
在三次握手期间,会进行窗口大小的交换。

所以滑动窗口就是流量控制的实际策略。


快重传

刚才提到一个概念,连续收到三条相同序号的ACK后,会立即重发报文。这个机制叫做快重传。

快重传VS超时重传

既然有了快重传,那为什么还要有超时重传?

快重传是提高效率的,如果连续收到三条相同序号的ACK就会重发。但是在极端情况下,数据只有2条。只有4000,5000,就不能发送三条连续报文。所有超时重传是兜底的。二者相互构成TCP重发策略。


拥塞控制

之前谈到TCP保证可靠性,都是都在双方主机上。如果网络出现拥塞,那么就算滑动窗口再大,也不能将数据报文全部发出。否则就会导致网络更加拥堵。

控制单次发送量的多少是由滑动窗口来决定的。也就是说在网络不好的时候,窗口就应该减小。网络好的时候,再由接收端的缓冲区决定。

TCP协议还考虑了网络健康状态,设计了一种策略避免网络的算法——拥塞控制。

如果网络发生了拥挤,说明当前的网络群出现了问题。就发送小部分报文进行试探。如果试探出是正常的,则快速增加单次发送的大小。这就是拥塞控制的特点:前期慢,增长快。

当然,也不能一直无限制的快速增长,增长到某一阈值的时候,增速就放慢。如果网络再次出现拥塞,发送的大小就立马减少到1。

重点关注:
阈值、窗口大小 

这种机制叫做慢启动,先发送少量数据,探探路,摸清楚当前的网络状况后,快速恢复。

再回到流量控制,流量控制的策略是滑动窗口,而滑动窗口不仅依赖于对方窗口大小,还依赖于拥塞窗口的大小。

滑动窗口

  • start=确认序号 ack_seq
  • end=确认序号+min(对端窗口,拥塞窗口)

延迟应答

如果每一份报文都采用ack。那么上层来不及将数据取走,就会导致窗口的减少,而确认序号表示:确认序号之前的报文全部收到。那么就没必要每一个报文都立马进行ACK。

延迟应答是提高效率的策略,每隔N个报文就进行一次ACK,那么上层就有时间取走数据。窗口就更大,发送的数据就更多。


粘包问题

由于TCP协议是面向字节流的,数据是无边界的,发多少就收多少。一份数据的结尾可能读到下一份数据,这就产了一个严重的问题。数据粘包:读到报文的实际数据偏少或者偏多。

为了解决粘包问题,常见的策略

  • 固定长度
  • 变长+自描述字段:比如再报头添加长度
  • 变长+结尾分隔符

另外粘包问题是针对TCP协议,UDP无粘包问题。因为UDP面向数据包,报文本身就有自描述字段,天然是一份完整的报文。


TCP异常

进程终止:OS会自动进行四次挥手,自动关闭链接

重启:自动进行四次挥手,自动关闭链接

机器断电:保活机制

如果机器发生断电:对端的服务会定时发送一个报文,如果在保活期间得不到ACK后会自动关闭链接。但是这个保活时间一般会维持120分钟。不推荐用TCP自带的保活机制,由引用层自己设置。

至此TCP协议的绝大多数的内容都已经介绍完毕了

TCP保证可靠性的策略

  • 流量控制
  • 按序到达
  • 确认应答
  • 超时重传
  • 连接管理
  • 拥塞控制

不仅如此TCP为了提高效率也做了很多准备

提高效率

  • 延迟应答
  • 快重传
  • 滑动窗口
  • 捎带应答

另外TCP效率不一定比UDP慢!TCP是可靠的,UDP是不可靠的。可靠与不可靠是中性的。

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

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

相关文章

腾讯地图SDK Android版开发 7 覆盖物示例1

腾讯地图SDK Android版开发 7 覆盖物示例1 前言界面布局MapMarker类常量成员变量初始值Marker点击事件Marker拖拽事件创建覆盖物移除覆盖物设置属性 MapMarkerActivity类控件响应事件 运行效果图 前言 文本介绍Marker的常用属性、交互和碰撞示例。 示例功能如下: …

【计算机网络】认识端口号 认识传输层协议 认识网络字节序 认识socket套接字

👦个人主页:Weraphael ✍🏻作者简介:目前正在学习c和算法 ✈️专栏:Linux 🐋 希望大家多多支持,咱一起进步!😁 如果文章有啥瑕疵,希望大佬指点一二 如果文章对…

收银系统源码—千呼新零售【硬件篇】

连锁店收银系统源码—多商户平台入驻商城已上线-CSDN博客文章浏览阅读1k次。零售行业连锁店收银管理系统多商户入驻本地生活即时零售平台商城https://blog.csdn.net/V15850290240/article/details/141310629 详细介绍请查看上方文章↑↑↑ 详细介绍请查看上方文章↑↑↑ 详细…

[大模型]配置文件-Langchain-Chatchat-V0.3 (1)

文章目录 简述本地配置配置文件model_settings.yaml使用Ollama配置模型配置 使用Xinference配置模型配置修改默认使用的模型 对话基础对话知识库对话 简述 针对Langchain-Chatchat-V0.3版本,对配置文件与模型使用说明,本文建议使用Ollama配合Chatchat使…

用Python实现9大回归算法详解——09. 决策树回归算法

1. 决策树回归的基本概念 决策树回归(Decision Tree Regression)是一种树状结构的回归模型,通过对数据集进行递归分割,将数据分成更小的子集,并在每个子集上进行简单的线性回归。决策树的核心思想是通过选择特征及其阈…

centos7.9系统安装cloudpods并使用ceph存储(二)

1.ceph安装 1.1 环境准备 配置hosts: $ vim /etc/hosts 10.121.x.x node01设置ssh无密码登录: # ssh-keygen -t rsa # ssh-copy-id -i /root/.ssh/id_rsa node01关闭selinux、firewalld # setenforce 0 # sed -i "s#SELINUXenforcing#SELINUXd…

国自然研究热点、“C位出圈”的类器官研究离不开细胞因子

前 言: 目前,类器官已从基础研究发展至药物开发和精准治疗。在疾病建模、药物开发、肿瘤研究、再生医学、精准医学等领域发展迅速。类器官与体内器官在功能和结构上的高度相似,使其广泛用于发育生物学和疾病建模。传统的2D细胞模型和模式动物…

k8s之Pod对象多种调度方式

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

Redis数据库一文入门

Redis 是一个用于存储和管理数据的开源内存数据结构存储系统。它以其高性能和丰富的数据结构支持而闻名,是构建高效、可扩展应用程序的理想选择。本文将带你入门 Redis,并探讨其基本概念、安装步骤和一些常见的使用场景。 什么是 Redis? Re…

疯感工牌的风还是吹到了L4级无人驾驶

俗话说得好,打工人哪有不疯的? 最近你是不是也被“发疯工牌梗”刷屏了 一张张看似情绪稳定的工牌 以独特的方式展现了属于打工人自己的个性 这不,疯感工牌的风也吹到了无人驾驶 无人车也有了属于自己的时尚单品 看看它们都是如何介绍自己的&a…

Wot Design Uni:一个高颜值、轻量化的uni-app组件库,uni-app生态的新宠

一、介绍 wot-design-uni组件库基于vue3Typescript构建,参照wot design的设计规范进行开发,提供70高质量组件,支持暗黑模式、国际化和自定义主题,旨在给开发者提供统一的UI交互,同时提高研发的开发效率。 特性&#x…

新的网络钓鱼方法针对 Android 和 iPhone 用户

关注公众号网络研究观获取更多内容。 ESET 研究人员发现了一种针对 Android 和 iPhone 用户的不常见网络钓鱼活动。 他们分析了一起针对捷克某知名银行客户的网络钓鱼案例。 网络钓鱼流程 这种技术值得注意,因为它会从第三方网站安装钓鱼应用程序,而无…

数据可视化大屏模板-美化图表

Axure作为一款强大的原型设计软件,不仅擅长构建交互式界面,更在数据可视化方面展现出了非凡的创意与实用性。今天,就让我们一起探索Axure设计的几款精美数据可视化大屏模板,感受数据之美。 立体图表的视觉冲击力 Axure的数据可视…

【大模型理论篇】基于3D可视化视角理解GPT

1. 背景介绍 先前我们通过多篇技术文章来分析大模型的原理,包括: 《Transformer原理及关键模块深入浅出》《GPT系列预训练模型原理讲解》、《大模型时代下Bert去哪啦》、《关于LLaMA 3.1 405B以及小模型的崛起》、《LLaMA3结构关键模块分析》、《强化学习…

JS基础进阶2-操作元素

目录 1.操作元素-修改DOM(文档对象模型)元素 1. 修改元素的文本内容 2. 修改元素的样式 3. 修改元素的属性 4. 修改元素的类名 5.修改body元素 2.修改自定义属性 2.1H5中设置自定义属性、 2.2使用JavaScript修改自定义属性 3.节点操作 3.1节点概…

不懂就问,换毛季猫咪疯狂掉毛怎么办?宠物浮毛该如何清理?

最近天气变热了,每天都30度以上,我家猫狂掉毛,床上、地板上堆积了不少。第一次养猫的我没见过这种阵仗,以为它生病了,连忙带它去看医生。医生告诉我,这是正常的猫咪换毛现象,我才放下心来。原来…

Python代码加密打包发布

本博客主要介绍: 1. 将python代码编译为so(win环境是pyd) 2.打包生成wheel文件,可以使用pip 进行安装 1. 项目结构 注意,__init__.py文件是必须的,内容可为空 2. example.py 里面是自己写的一些方法&am…

【hot100篇-python刷题记录】【滑动窗口最大值】

R6-子串篇 目录 Max Sort 单调队列法&#xff1a; Max 完了&#xff0c;我好像想到python的max class Solution:def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:ret[]left,right0,kwhile right<len(nums):ret.append(max(nums[left:right]))ri…

聊聊 PHP 多进程模式下的孤儿进程和僵尸进程

在 PHP 的编程实践中多进程通常都是在 cli 脚本的模式下使用&#xff0c;我依稀还记得在多年以前为了实现从数据库导出千万级别的数据&#xff0c;第一次在 PHP 脚本中采用了多进程编程。在此之前我从未接触过多进程&#xff0c;只知道 PHP-FPM 进程管理器是多进程模型&#xf…

【技术方案】智慧城市大数据平台技术方案(Doc原件)

第1章 总体说明 1.1 建设背景 1.2 建设目标 1.3 项目建设主要内容 1.4 设计原则 第2章 对项目的理解 2.1 现状分析 2.2 业务需求分析 2.3 功能需求分析 第3章 大数据平台建设方案 3.1 大数据平台总体设计 3.2 大数据平台功能设计 3.3 平台应用 第4章 政策标准保障体系 4.1 政策…