【网络原理】TCP 协议中比较重要的一些特性(二)

简介: 【网络原理】TCP 协议中比较重要的一些特性(二)

1、TCP 状态转换

TCP 状态和“线程状态”是类似的概念,用于描述 TCP 连接过程中正在执行什么操作。


TCP 服务器和客户端都有一定的数据结构来保存连接信息,而这个数据结构中有一个属性叫“状态”,操作系统内核根据状态的不同,决定当前应该执行什么操作。


TCP 状态转换图

1.1、三次握手状态


  • LISTEN 状态表示服务器创建好了 serverSocket,并且绑定客户端完成,等待客户端 new Socket 进行三次握手连接。
  • ESTABLISHED 状态表示连接已经建立完毕,三次握手完成。图中的两个 ESTABLISHED 状态可以认为是几乎同时进入。

1.2、四次挥手状态


  • CLOSE_WAIT 表示收到对方发送过来的 fin,接下来的代码中需要调用 close 来主动返回 fin,由于关闭速度 socket 非常快,该状态不太容易被察觉到。【谁被动断开连接,谁进入 CLOSE_WAIT】
  • TIME_WAIT 表示本端给对方发起 fin 之后,对方也给返回了 fin,该状态存在的意义是给最后一个 ack 重传留有一定时间,防止最后一个 ack 丢包,只要该状态还存在,就依然会保存对端的信息,才能为连接提供各种操作(包括返回 ack )。【谁主动断开连接,谁进入 TIME_WAIT】

需要注意的是:TIME_WAIT 也不会无休止的等待,最多等待 2 MSL(MSL 是系统内核的配置项,表示客户端到服务器之间,允许消耗的最长时间),一旦超过这个时间,就再也不会发送 ack 了。


2、滑动窗口

滑动窗口时是 TCP 中非常有特点的机制。


正常机制下


滑动窗口下

正常的确认应答机制下,每次发送放收到一个 ack 后才会发送下一个数据,导致大量的时间都消耗在等 ack 上。


而滑动窗口就可以在保证可靠性传输的基础上,提高效率(减少损失的速度,而不是增加速度),通过批量传输,把多次请求的等待时间,使用同一份时间来等,减少了总的等待时间。


例如:此时批量4个数据,对应4个 ack,这4个 ack 到达的时间各异,此时不需要等所有 ack 都到达,只要有一个 ack到达,就发送下一个数据,不需要管 ack 的顺序。



当采用滑动窗口的策略时,如果出现丢包,如何进行重传?这里分两种情况讨论:


1、ack 丢了

这种情况下, 部分 ack 丢了并不要紧,对可靠性没有影响,不需要进行重传,因为可以通过后续的 ack 进行确认。



2、数据丢了


数据丢了必然需要重传。 上述重传的过程中,整体的效率是非常高的,因为这里的重传做到了“针对性”重传,不会有重复发送,整体的效率没有额外的损失,这种重传称为“快速重传”。


TCP 有接收缓冲区(生产者消费者模型),发送的数据先放到缓冲区里排队,当发现缓冲区中的数据不连续时证明数据丢失,就会重传对应的数据,待数据补齐后再继续接收后面的数据。



3、流量控制

滑动窗口的窗口大小不能无限大,如果窗口过大导致发送速度大于接收方的处理速度(导致接收缓冲区满了),就会出现丢包问题,进而影响了 TCP 的可靠传输。【任何提升效率的行为都不应该影响到可靠性】


为了让发送速度与处理速度保持步调一致,就需要根据接收方的处理能力反过来影响发送方的发送速率,称为“流量控制”。通过这个字段来给发送方反馈发送速度。该字段在普通报文中无意义,在 ack 报文中才有意义。接收方会按照自身接收缓冲区的剩余空间大小(又称为“接收窗口”)作为 ack 中窗口大小的数值,发送方就能根据该数值调整窗口大小。



当接收窗口逐渐较少,直至到 0 后,此时接收方的接收缓存区已满,发送方将停止发送。然后发送方会周期性发送窗口探测包(不携带载荷),用于查询窗口大小,当查询到窗口大小不为 0 时继续发送。


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
2月前
|
安全 网络协议 Linux
Linux网络应用层协议展示:HTTP与HTTPS
此外,必须注意,从HTTP迁移到HTTPS是一项重要且必要的任务,因为这不仅关乎用户信息的安全,也有利于你的网站评级和粉丝的信心。在网络世界中,信息的安全就是一切,选择HTTPS,让您的网站更加安全,使您的用户满意,也使您感到满意。
87 18
|
3月前
|
安全 网络安全 定位技术
网络通讯技术:HTTP POST协议用于发送本地压缩数据到服务器的方案。
总的来说,无论你是一名网络开发者,还是普通的IT工作人员,理解并掌握POST方法的运用是非常有价值的。它就像一艘快速,稳定,安全的大船,始终为我们在网络海洋中的冒险提供了可靠的支持。
114 22
|
3月前
|
网络协议 数据安全/隐私保护 网络架构
|
4月前
|
网络协议 物联网
VB6网络通信软件上位机开发,TCP网络通信,读写数据并处理,完整源码下载
本文介绍使用VB6开发网络通信上位机客户端程序,涵盖Winsock控件的引入与使用,包括连接服务端、发送数据(如通过`Winsock1.SendData`方法)及接收数据(利用`Winsock1_DataArrival`事件)。代码实现TCP网络通信,可读写并处理16进制数据,适用于自动化和工业控制领域。提供完整源码下载,适合学习VB6网络程序开发。 下载链接:[完整源码](http://xzios.cn:86/WJGL/DownLoadDetial?Id=20)
146 12
|
4月前
|
缓存 网络协议 API
掌握网络通信协议和技术:开发者指南
本文探讨了常见的网络通信协议和技术,如HTTP、SSE、GraphQL、TCP、WebSocket和Socket.IO,分析了它们的功能、优劣势及适用场景。开发者需根据应用需求选择合适的协议,以构建高效、可扩展的应用程序。同时,测试与调试工具(如Apipost)能助力开发者在不同网络环境下优化性能,提升用户体验。掌握这些协议是现代软件开发者的必备技能,对项目成功至关重要。
|
7月前
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
180 17
|
7月前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
136 10
|
7月前
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。
|
7月前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
在数字化时代,网络安全和信息安全已成为我们生活中不可或缺的一部分。本文将介绍网络安全漏洞、加密技术和安全意识等方面的内容,并提供一些实用的代码示例。通过阅读本文,您将了解到如何保护自己的网络安全,以及如何提高自己的信息安全意识。
154 10
|
7月前
|
监控 安全 网络安全
网络安全与信息安全:漏洞、加密与意识的交织
在数字时代的浪潮中,网络安全与信息安全成为维护数据完整性、保密性和可用性的关键。本文深入探讨了网络安全中的漏洞概念、加密技术的应用以及提升安全意识的重要性。通过实际案例分析,揭示了网络攻击的常见模式和防御策略,强调了教育和技术并重的安全理念。旨在为读者提供一套全面的网络安全知识框架,从而在日益复杂的网络环境中保护个人和组织的资产安全。