【计算机网络】初识Tcp协议

news2024/9/19 10:35:44
在这里插入图片描述

💻文章目录

  • 📄前言
  • Tcp基础
    • 概念
    • Tcp 的报文格式
    • 三次握手
    • 四次挥手
  • Tcp的滑动窗口机制
    • 概念
    • 超时重传机制
      • 高速重传
  • TCP传输控制机制
    • 流量控制
    • 拥堵控制
      • 慢启动
  • Tcp的性能优化机制
    • 延迟应答
    • 捎带应答
  • 📓总结


📄前言

TCP三次握手、四次挥手,相信许多计算机网络初学者们都对这些问题感到困扰,TCP协议作为考试、面试的大常客,如果不真正了解它们的原理,那么等待你的很可能是挂科、回去等通知吧(大悲)。为了避免悲剧的再度发生,学习TCP协议不容刻缓,从现在开始!!!

Tcp基础

概念

TCP(Transfer Control Protocol) ,是一种可靠的、面向连接的网络通信协议,常用与那些对数据完整性有严格要求的场景,如聊天、文件传输、Web浏览等场景。

Tcp能够实现对数据的流量控制、重发控制、拥塞控制等功能,如果只是在应用层中使用TCP协议,那么肯定是无法体会得到其内部机制的精细,让我们从理论开始入手Tcp协议吧。

Tcp的优缺点:

  • 优点

    • 保障数据传输的可靠性
    • 拥有流量控制功能
    • 拥有拥塞控制功能
  • 缺点

    • 实现复杂,性能较低(相比UDP)
    • 延迟较高,Tcp偏重于数据的可靠传输

Tcp 的报文格式

要了解Tcp的工作机制,就得先从它的报文格式开始谈起,下图为Tcp的报文格式。

		 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
		 |          源端口号            |          目的端口号              |
		 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
		 |                        序列号                                 |
		 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
		 |                        确认号                                 |
		 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
		 |   4| 保留  |     |U|A|P|R|S|F|   |                     |
		 |   首部    | (6) |     |R|C|S|S|Y|I|   |      16位窗口大小     |
		 |   大小    |       |     |G|K|H|T|N|N|   |                     |
		 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
		 |           16位校验和         |           16位紧急指针            |
		 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
		 |                       选项及填充(若有)                         |
		 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
		 |                          数据                                 |
		 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  • 端口号:Tcp使用4字节(32bit)来表示源端口和目的端口号,系统会根据端口号的不同来区分连接。
  • 序列号:数据的序列号,因为接收的数据顺序可能不一致,所以需要序列号来进行排序。
  • 确认号:用于告知发送端已经下一次要收的数据序列。
  • 首部大小:用于确定Tcp的报头长度,计算方式为 首部大小 * 4,也就是说报文头部大小最大为60字节。
  • 标志位:类似于一种信号,使用bit位来标志使用到的标志位。
    • URG (Urgent):确定紧急指针是否有效,一般很少用紧急指针的内容。
    • ACK (Acknowledge):表明数据已经收到。
    • PSH (Push): 告诉系统赶紧把数据取走
    • RST (Rest): 用于重置连接,在服务器客户端连接认知不一致的情况使用。
    • FIN (Finish):用于4次挥手,表明要结束连接。
  • 窗口大小:流量控制机制,用于表明接受方的缓冲区大小。
  • 校验和:用于校验数据是否完整。
  • 紧急指针:用于标识一个字节的紧急数据的地址(很少用到)。
  • 选项:常见的选项有MSS(Maximum Segment Size)——拥塞窗口大小。

三次握手

三次握手是TCP协议进行网络通信时必须要做的一件事情,所有的连接都的要进行三次握手后才能开始传输数据。这是为了确定通信双方能够建立可靠的连接,并且交换双方的信息。

三次握手的过程

  1. 第一次握手由客户端开始发起,用于确定服务器是否存在。
  2. 第二次握手是服务器应答请求并发起连接请求,当客户端收到后则客户端对服务器的连接就已经建立完毕。
  3. 第三次握手是客户端通知服务器建立连接。

请添加图片描述

连接丢失的情况:

  • 第一、二次握手连接丢失:客户端因为没有收到服务器的消息,所以会重新发送报文给服务器。
  • 第三次握手连接丢失:这种情况便是双方连接认知不一致,因为客户端会认为服务器端已经收到了报文并且建立了连接。客户端在这种情况下发送数据给服务器端的话,服务器会发送一个带有RESET标志的报文给客户端,重新进行三次握手。

请添加图片描述

四次挥手

四次挥手是用于安全断开连接的措施。当客户端选择断开连接的时候,服务器端可能还有数据没有传输完毕,所以需要将连接稍微延长,直到数据被完全传输完毕。

  1. 第一次挥手:表明本地已经没有需要发送的数据,告诉远端准备好断开连接。
  2. 第二次挥手:远端已经收到FIN信号,返回应答,并继续处理未处理完的数据。
  3. 第三次挥手:远端已经处理完所有数据,告诉本地已经关闭连接(FIN)。
  4. 第四次挥手:本地进行应答,然后进入TIME_WAIT状态,一段时间后结束(CLOSED)。

请添加图片描述

四次挥手的小细节:

  • 四次挥手不像三次握手一样,会造成认知不一致状态。
  • 四次挥手有极小概率会变成三次挥手(即当FIN信号到了的时候,数据早已经处理完毕)。
  • TIME_WAIT状态的时间是2 * MSL(最大报文生存时间),而这个时间也是Tcp报文在网络的最大生存时间,从而确保网络的延迟报文能够正确接收,避免影响下次复用该端口号时收到未知的报文。

Tcp的滑动窗口机制

概念

Tcp的三次握手中报文的交换是一个接一个的,但如果数据的传输也是如此,势必会让传输的效率遭到大幅度地下降,于是Tcp协议使用了滑动窗口这种机制来让数据高效传输。

请添加图片描述

滑动窗口传输的细节:

  1. 滑动窗口通过序列号来将收到的报文规范排列。
  2. 滑动窗口使用确定序列号来通知远端下一个要接收到报文。
  3. 确定序列号代表该序列号之前的报文已经全部接收。
  4. 滑动窗口允许一定的确定报文丢失,因为确定序列号代表之前的报文已经全部接收,只要最后到确定报文到达即可。

超时重传机制

当Tcp发送报文长时间没有得到应答,则会进行超时重连,没有收到应答的原因可能是发送的报文数据在网络传输过程中丢失了,也可能是对端发送的ACK消失了。无论是哪一种情况,发送方都会重新发送数据给接受端,接受端再根据Tcp报文中的序列号来确定该数据是否已经接收过

请添加图片描述

高速重传

我们已经知道滑动窗口是用于提高数据传输的效率的,如果有任意一个报文没收到都要等待这么长时间才能重新接受,那么不就是本末倒置了吗?于是TCP又设置了高速重传机制——当连续三个ACK报文的确认序列号都相同时,发送端将重发该序列段的数据。

请添加图片描述

TCP传输控制机制

流量控制

设想一下,如果你正在下载某个文件,下载速度非常地快,以至于你的硬盘都来不及去读取你下载的内容,而服务器又不停地高速给你发送数据,那么你的系统也只能丢弃这些数据,但这样会造成非常大的网络资源浪费。有没有什么办法能够阻止这种浪费呢?

你是否还记得Tcp报头中有一个窗口大小呢?其实Tcp在进行三次握手和传输数据期间,都会根据双方缓冲区的大小动态更新窗口大小,从而实现流量的控制。

请添加图片描述

流量控制的小细节:

  1. 接收端通过接收缓冲区的大小更新滑动窗口大小,然后通过ACK报文通知发送端。

  2. 窗口大小也是反映网络吞吐量的标准。

  3. 当接收端窗口大小为0,发送端将停止发送数据一段时间并定时发送窗口探测,直到接收端有能力接受数据。

拥堵控制

慢启动

我们已经知道TCP拥有流量控制功能,滑动窗口能够根据对方的缓冲区(窗口大小)动态调整,但网络环境是复杂的,我们还需要考虑客户端与服务器之间的网络情况。如果一次发送大量的数据给对方,可能会对网络造成瘫痪。为了防止这种情况的发生,TCP使用了慢启动算法。

请添加图片描述

  1. 慢启动:其实在Tcp协议的内部,还定义了一个叫做拥塞窗口的变量(非窗口),当数据开始进行传输时,这个值被设为1,发送端每收到一个来至接收端的ACK时,拥塞窗口都会呈指数增长

  2. 拥堵避免:一旦拥堵窗口达到一定大小(阈值)时便会进入线性增长模式,即每接受一个ACK,拥塞窗口就+1。

  3. 动态调整: 因为网络的状态总是不稳定的,所以拥塞窗口的阈值会随着网络的丢包/持续传输而动态变化。

滑动窗口大小实际为:min( 窗口大小,拥塞窗口 )。

Tcp的性能优化机制

延迟应答

在文章上方的介绍中,我们都是以发送端每发送一个报文,接收端就返回一个报文来进行通信的,但实际的通信过程中,接收端并不会立刻应答,而是选择等待一段时间,接受多个报文后再回复对方,从而减少网络的压力。

请添加图片描述

延迟应答的小细节:

  1. 根据操作系统的不同,可能会在接受到两个报文后直接回复。
  2. 根据操作系统的不同,延迟发送的时间也会不同,时间越长触发超时重传的概率也就越高,一般操作系统将延迟应答时间设置为0.2秒。

捎带应答

捎带应答其实我们在三次握手中已经见到过了,其实也就是在发送其他数据的时候同时带着应答报文,从而减少应答报文在网络的传输,降低网络压力。

📓总结

TCP协议的设计不仅考虑了连接的可靠性,还考虑到了流量控制、拥堵控制、性能优化等各种方法,相信学习了本文了你,被问到TCP协议的特点时,肯定能侃侃而谈,给对方一个好影响吧。

参考书籍:《图解TCP/IP》

📜博客主页:主页
📫我的专栏:C++
📱我的github:github

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

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

相关文章

element-ui 实现输入框下拉树组件(2024-05-23)

用element-ui的 el-input&#xff0c;el-tree&#xff0c;el-popover组件组合封装 import url("//unpkg.com/element-ui2.15.14/lib/theme-chalk/index.css"); <script src"//unpkg.com/vue2/dist/vue.js"></script> <script src"//…

SEO之核心关键词(一)

初创企业需要建站的朋友看这篇文章&#xff0c;谢谢支持&#xff1a; 我给不会敲代码又想搭建网站的人建议新手上云 选择关键词的第一步是确定网站核心关键词。 核心关键词通常就是网站首页的目标关键词。一般来说&#xff0c;整个网站会有很多目标关键词&#xff0c;这些关键…

记一次MySQL执行修改语句超时问题

异常问题 原因分析 这个问题发生在开发环境&#xff0c;怀疑是提交事务时终止项目运行&#xff0c;没有提交该事务&#xff0c;造成死锁 调试该事务时时间太长&#xff0c;为什么说有这个原因呢&#xff0c;因为通过查找日志显示 The client was disconnected by the server …

【二叉树算法题记录】236. 二叉树的最近公共祖先

题目链接 题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个…

Day04-Maven,SpringBoot,Tomcat下载及相关配置

1. maven 2. MaVen是一款管理和构建java项目的工具 2.1 概述 mvn -v2.1 配置Maven环境&#xff08;当前工程&#xff09; 全局配置maven 3. SpringBoot 3.1 SpringBoot入门 package com.jingwei.controller;import org.springframework.web.bind.annotation.…

一个和蔼可亲的Python库,用Gooey为你的程序添加GUI

大家好&#xff0c;你有没有遇到过这样的情况&#xff1a;你写了一个非常棒的命令行程序&#xff0c;但当你分享给朋友或同事时&#xff0c;他们却因为害怕命令行而不愿意使用&#xff1f;这时候&#xff0c;一个简洁美观的图形用户界面&#xff08;GUI&#xff09;就派上用场了…

产品经理-需求分析(三)

1. 需求分析 从业务的需要出发&#xff0c;确定业务目的和目标&#xff0c;将业务需求转为产品需求 1.1 业务需求 业务需求 业务动机 业务目标 就是最根本的动机和目标成果&#xff0c;通过这个需求解决特定的问题 1.2 产品需求 产品需求 解决方案 产品结构 产品流程…

CI/CD 管道中的自动化测试:类型和阶段

在上一篇文章中&#xff0c;我们讨论了敏捷团队自动化测试用例的各种用例。其中一种情况是&#xff0c;团队希望将测试与每个构建集成&#xff0c;并将持续集成作为构建过程的一部分。 在本文中&#xff0c;我们将讨论持续集成/持续交付平台中的集成测试。 让我们先从基础知识…

Spring Cloud | 服务 “注册与发现“ 框架 : Eureka框架

目录&#xff1a; Eureka 的 "工作机制" :一、Eureka 的 "工作原理" ( 两大组件 ) :1.1 Eureka Server ( 服务注册中心 )1.2 Eureka Client ( 服务/服务实例&#xff0c;其存在 "两种角色" : ①服务提供者 ②服务消费者 ) :Eureka Client 的 含义…

【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串

【LeetCode刷题】Day 7 题目1&#xff1a;209.长度最小的子数组思路分析&#xff1a;思路1&#xff1a;暴力枚举 O(N^2^)思路2&#xff1a;滑动窗口 O(N) 题目2&#xff1a;3. 无重复字符的最长子串题目分析&#xff1a;思想1&#xff1a;暴力枚举哈希表O(N^2^)思想2&#xff1…

时间(空间)复杂度(结构篇)

目录 前言&#xff1a; 一、时间复杂度 1.1 时间复杂度的定义 1.2 时间复杂度的分析 表示方法&#xff1a; 1.3 常见的时间复杂度 1.4 时间复杂度的计算以及简单的分析 冒泡排序 折半查找&#xff08;二分查找&#xff09; 斐波那契数列&#xff08;递归&#xff09…

Android卡顿丢帧低内存与adb shell内存状态

Android卡顿丢帧低内存与adb shell内存状态 卡顿丢帧除了CPU/GPU层面&#xff0c;另外&#xff0c;也需要特别注意整机低内存情况。kswapd0 是一个内核工作线程&#xff0c;内存不足时会被唤醒&#xff0c;做内存回收工作。 当内存频繁在低水位的时候&#xff0c;kswapd0 会被频…

人类最友好语言? YAML 深入解析:从语法到最佳实践

什么是YAML YAML&#xff08;YAML Ain’t Markup Language&#xff09;是一种人类可读的数据序列化语言。它的设计目标是使数据在不同编程语言之间交换和共享变得简单。YAML采用了一种简洁、直观的语法&#xff0c;以易于阅读和编写的方式表示数据结构。 YAML广泛应用于配置文…

C语言题目-添加逗号(详解)

前言 今天来看看如何使用C语言对一串数字添加逗号吧&#xff0c;在我们电子账户上的余额都是每3位数有一个逗号吧&#xff0c;今天让我们来使用C语言实现这个功能。 题目描述 对于一个较大的整数 N(1<N<2,000,000,000) 比如 980364535&#xff0c;我们常常需要一位一位数…

8、Qt—Log4Qt使用小记2(每日产生文件)

前言&#xff1a; 开发平台&#xff1a;Win10 64位 开发环境&#xff1a;Qt Creator 13.0.0 构建环境&#xff1a;Qt 5.15.2 MSVC2019 64位 例如&#xff1a;上一篇文章中笔者记录了Log4qt的编译及配置使用&#xff0c;这篇文章重点写下每天产生文件到指定文件夹中&#xff0c;…

软考高级架构师:数据库案例篇 - ER 图和数据流图

一、讲解 从数据流图&#xff08;DFD&#xff09;转换为实体关系图&#xff08;ER图&#xff09;是一个重要的步骤&#xff0c;可以帮助将系统的动态流程转换为静态的数据模型。以下是一些经验和步骤&#xff0c;帮助你完成这一过程&#xff1a; 1. 理解数据流图 识别进程&a…

【操作系统】基本概念 解析+思维导图(特征、概念、功能)并发 共享 虚拟 异步

1.操作系统基本概念 思维导图 1.1 概念和功能 概念 操作系统&#xff08;Operating System&#xff0c;OS&#xff09; 1.操作系统是系统资源的管理者&#xff1a; ​ 操作系统是指控制和管理整个计算机系统的硬件和软件资源&#xff0c;并合理组织调度计算机的工作和资源分…

跟TED演讲学英文:How to escape education‘s death valley by Sir Ken Robinson

How to escape education’s death valley Link: https://www.ted.com/talks/sir_ken_robinson_how_to_escape_education_s_death_valley Speaker: Sir Ken Robinson Date: April 2013 文章目录 How to escape educations death valleyIntroductionVocabularySummaryTranscri…

redis6.2.7安装

1、下载上传到服务器 从官下载redis&#xff0c;地址 https://redis.io/download/#redis-downloads 然后上传到服务器目录 app/apps目录下 2、安装gcc编译器 使用gcc --version命令测试是否已经安装了gcc编译环境&#xff0c;如果没有安装执行以下命令安装 yum install -y …

2024系统架构师软考考题考点回忆版

2024系统架构师软考试题/考点梳理 选择题 (75道单选题) 软件测试(P205) 静态测试:是被测程序不运行,只依靠分析和检查源程序的语句、结构、过程来检查程序是否有错误。动态测试:运行被测试程序,对得到的结果与预期的结果进行比较分析,同时分析运行效率和健壮性能等。…