计算机网络知识点全梳理(三.TCP知识点总结)

目录

TCP基本概念

为什么需要TCP

什么是TCP

什么是TCP链接

如何唯一确定一个 TCP 连接

TCP三次握手

握手流程

为什么是三次握手,而不是两次、四次

为什么客户端和服务端的初始序列号 ISN 不同

既然 IP 层会分片,为什么 TCP 层还需要 MSS 

TCP四次挥手

挥手流程

为什么挥手需要四次 

为什么TCP挥手需要有TIME WAIT状态

除了四次挥手还有什么方法能断开连接

TCP重传机制

超时重传

快速重传(Fast Retransmit)

TCP滑动窗口

TCP拥塞控制

TCP与UDP

TCP和UDP区别

TCP和UDP的应用场景 


写在前面

本系列文章:

计算机网络知识点全梳理(一.TCP/IP网络模型)

计算机网络知识点全梳理(二.HTTP知识点总结)

计算机网络知识点全梳理(四.IP知识点总结)

TCP基本概念

为什么需要TCP

IP层本身不具备可靠性特性,它不确保数据包的送达、顺序或完整性。为了实现网络数据包的可靠传输,必须依赖传输层的TCP协议。TCP提供了一种可靠的传输服务,确保数据包在接收端无损、连续、无重复且按正确顺序到达。

什么是TCP

TCP是一种面向连接、可靠且基于字节流的传输层通信协议。其特点包括:

  • 面向连接:TCP建立的连接是点对点的,不支持一对多的广播式通信,这与UDP的多播能力形成对比。
  • 可靠性:TCP能够在各种网络条件下确保数据包的送达,即使在网络链路变化的情况下也能保证数据的完整传输。
  • 字节流:TCP传输的数据是连续的字节流,没有明确的边界,因此可以传输任意大小的消息。此外,TCP保证数据的顺序性,只有当所有前序数据都到达后,才会将数据传递给应用层,并能自动丢弃重复的数据包。

什么是TCP链接

RFC 793定义了「连接」的概念:

它涉及一系列状态信息,这些信息共同确保了通信的可靠性和流量控制。这些状态信息包括套接字(Socket)、序列号和窗口大小。因此,建立一个TCP连接需要客户端和服务器就这些关键信息达成一致。

  • 套接字(Socket):由IP地址和端口号组成,用于标识通信的两端。
  • 序列号:用于解决数据包乱序问题,确保数据的正确排序。
  • 窗口大小:用于流量控制,调节数据传输速率以避免接收方过载。

如何唯一确定一个 TCP 连接

TCP连接可以通过一个四元组唯一标识,该四元组包含以下元素:

  • 源地址:标识发送方的IP地址。
  • 源端口:指定发送方的应用程序端口。
  • 目的地址:标识接收方的IP地址。
  • 目的端口:指定接收方的应用程序端口。

源地址和目的地址(各32位)位于IP头部,负责通过IP协议将数据包发送到目标主机。源端口和目的端口(各16位)位于TCP头部,用于指示TCP协议将数据包转发给正确的进程。

TCP三次握手

握手流程

TCP三次握手(Three-Way Handshake)是建立一个可靠的、面向连接的通信会话的过程。它确保了两端的发送和接收能力都是就绪的,从而可以开始数据传输。以下是TCP三次握手的详细步骤:

  1. SYN:初始的同步步骤。客户端发送一个带有SYN(同步序列编号)标志的TCP段到服务器,以初始化一个连接。这个SYN段包含客户端的初始序列号(ISN),用于确保数据传输的可靠性。

  2. SYN-ACK:同步和确认步骤。服务器收到客户端的SYN段后,如果同意建立连接,会回复一个带有SYN和ACK(确认应答)标志的TCP段。这个SYN-ACK段包含了服务器的初始序列号,同时也确认了客户端的SYN段。

  3. ACK:最终的确认步骤。客户端收到服务器的SYN-ACK段后,会发送一个带有ACK标志的TCP段作为响应。这个ACK段确认了服务器的SYN段,完成三次握手过程。

三次握手完成后,客户端和服务器都确认了对方的发送和接收能力,一个稳定的TCP连接就建立了。这个过程不仅确保了连接的可靠性,还防止了过时的连接请求突然传送到服务器,从而避免了潜在的错误。

为什么是三次握手,而不是两次、四次

TCP三次握手的原因可以从以下三个方面进行分析:

  • 防止历史连接的重复初始化:这是三次握手的主要原因。RFC 793指出,三次握手的核心目的是防止旧的重复连接请求导致混乱。在网络环境中,数据包可能会因网络拥堵等原因延迟到达,甚至比新的数据包先到达目标主机。三次握手通过序列号和上下文信息,使客户端能够识别并终止历史连接,避免因旧的连接请求而建立不必要的连接。

  • 同步双方的初始序列号:TCP通信双方必须维护一个序列号,这是可靠传输的关键。序列号的作用包括:去除重复数据、按序接收数据包、标识已接收的数据包。因此,当客户端发送带有初始序列号的SYN报文时,需要服务器的ACK响应来确认接收;同样,服务器发送初始序列号时也需要客户端的确认。三次握手确保了双方的初始序列号被可靠同步。

  • 避免资源浪费:三次握手减少了不必要的资源开销。如果使用两次握手,将无法防止历史连接的建立,可能导致资源浪费,并且无法可靠同步双方的序列号。而四次握手虽然也能同步序列号,但三次握手已经是最少的可靠连接建立步骤,因此没有必要增加通信次数。

总结:TCP通过三次握手防止历史连接的建立,减少双方不必要的资源开销,并帮助双方同步初始序列号。序列号确保数据包不重复、不丢失且按序传输。不使用两次握手和四次握手的原因在于:两次握手无法防止历史连接的建立和资源浪费,也无法可靠同步序列号;而三次握手已经是最少的可靠连接建立步骤,无需更多的通信次数。

为什么客户端和服务端的初始序列号 ISN 不同

为了避免旧连接的残留报文干扰新连接,每次建立TCP连接时都会重新初始化一个新的序列号。这样做的主要目的是:

  • 区分报文:通过为每个新连接分配一个独特的序列号,通信双方可以准确识别并丢弃不属于当前连接的报文段,从而避免数据错乱。

  • 增强安全性:防止恶意用户伪造具有相同序列号的TCP报文,并使其被对方接收。独特的序列号使得攻击者难以预测有效的序列号,从而提高了连接的安全性。

既然 IP 层会分片,为什么 TCP 层还需要 MSS 

首先先解释两个概念:

  • MTU(Maximum Transmission Unit):指一个网络包的最大长度,以太网中通常为1500字节。

  • MSS(Maximum Segment Size):指除去IP和TCP头部后,一个网络包所能容纳的TCP数据的最大长度。

如果TCP报文(头部+数据)交给IP层进行分片,可能会导致以下问题:

  • IP层分片的隐患:当IP层需要发送的数据超过MTU时,它会将数据分片成多个小于MTU的片段。目标主机的IP层负责重组这些片段后再交给TCP层。然而,如果其中一个IP分片丢失,整个IP报文的所有分片都需要重传,因为IP层本身没有超时重传机制,这由TCP层负责。

  • TCP层的重传效率:当接收方发现TCP报文(头部+数据)的某一分片丢失时,不会发送ACK给发送方。发送方的TCP层在超时后会重传整个TCP报文(头部+数据),这导致IP层分片传输效率低下。

因此,为了提高传输效率,TCP协议在建立连接时通常会协商双方的MSS值。当TCP层发现数据超过MSS时,它会先进行分片,确保形成的IP包长度不会超过MTU,从而避免IP层分片。通过TCP层分片,如果一个TCP分片丢失,重发时以MSS为单位进行,而不需要重传所有分片,显著提高了重传效率。

TCP四次挥手

挥手流程

 

TCP四次挥手(Four-Way Handshake)是终止一个TCP连接的过程。它确保了数据的完整性,并允许双方有序地关闭连接。以下是TCP四次挥手的详细步骤:

  1. FIN:当一方(通常是客户端)完成数据发送并希望关闭连接时,它会发送一个带有FIN(结束)标志的TCP段。这个FIN段表示发送方已经没有更多数据要发送了,但它仍然可以接收数据。

  2. ACK:接收方(通常是服务器)收到FIN段后,会发送一个带有ACK(确认)标志的TCP段作为响应。这个ACK段确认了FIN段的接收,但此时连接尚未完全关闭,因为接收方可能还有数据要发送。

  3. FIN:当接收方也完成数据发送并准备好关闭连接时,它会发送一个带有FIN标志的TCP段。这表示接收方也没有更多数据要发送了。

  4. ACK:最后,发送方收到第二个FIN段后,会发送一个带有ACK标志的TCP段作为响应,确认FIN段的接收。此时,连接正式关闭。

四次挥手确保了双方都有机会发送完所有数据,并确认对方已经接收完所有数据。这个过程允许TCP连接优雅地关闭,避免了数据丢失或不完整的情况。四次挥手的目的是:

  • 确保双方都明确知道对方已经没有数据要发送。

  • 避免连接突然中断导致的数据丢失。

  • 允许双方在关闭连接前完成所有必要的数据传输和确认。

为什么挥手需要四次 

从挥手过程可以看出,服务器通常需要时间来完成数据的发送和处理,因此服务器的ACK和FIN包通常分开发送。这导致了四次挥手比三次握手多了一次交互。这种设计确保了双方都有机会完成数据传输,并确认对方已经接收完所有数据,从而优雅地关闭TCP连接。

为什么TCP挥手需要有TIME WAIT状态

  • 确保最终的ACK被成功接收:在TCP四次挥手过程中,主动关闭连接的一方在发送最后一个ACK确认包后,会进入TIME_WAIT状态。如果这个ACK丢失,被动关闭连接的一方未收到确认,会重发FIN报文。主动关闭的一方在TIME_WAIT状态下保持一段时间,以便能够重发ACK,确保连接正确关闭。

  • 防止旧的重复分段干扰新连接:TCP连接关闭后,可能会有延迟或失效的报文仍在网络中传输。如果立即使用相同的IP地址和端口建立新连接,可能会受到这些旧报文的干扰。TIME_WAIT状态确保旧连接的所有报文都超时失效后,才允许新连接使用相同的IP地址和端口,避免数据混乱。

除了四次挥手还有什么方法能断开连接

  • RST(Reset):TCP RST标志用于立即强制终止连接。发送方通过发送带有RST标志的TCP报文,指示接收方立即断开连接。

  • 超时(Timeout):如果连接在设定的超时时间内未传输任何数据包,连接双方可以自动断开连接。

TCP重传机制

TCP实现可靠传输的关键机制之一是序列号和确认应答。当数据到达接收端时,接收端会返回确认应答消息。然而,网络环境复杂,数据传输可能遇到问题,如数据包丢失。为此,TCP采用了多种重传机制来应对数据丢失。

超时重传

发送数据时,TCP设置一个定时器。如果在指定时间内未收到对方的ACK确认应答,将重发数据。超时重传适用于数据包丢失或确认应答丢失的情况。

  • 超时时间(RTO):RTO(Retransmission Timeout)是超时重传时间的指标。RTO的设置应略大于报文往返时间(RTT),以确保重传机制的效率。

  • RTO设置的影响:如果RTO过长,重传会延迟,影响性能;如果RTO过短,可能导致不必要的重传,增加网络拥塞。

快速重传(Fast Retransmit)

快速重传机制不依赖时间,而是基于数据驱动的重传。

  • 当发送端收到三个相同的ACK报文时,会在定时器过期前重传丢失的报文段。

  • 快速重传解决了超时时间的问题,但面临另一个问题:重传时应选择重传丢失的单个报文段还是所有报文段。

此外,TCP还使用了其他机制如选择性确认(SACK)和重复选择性确认(D-SACK)来提高重传的效率和准确性。这些机制共同确保TCP能够在各种网络条件下实现可靠的传输。

TCP滑动窗口

在网络环境中,数据传输速率需要灵活调整以适应网络条件。发送方需要掌握接收方的处理能力,以避免过量发送数据导致接收方无法及时处理。

TCP的滑动窗口机制正是为了解决这一问题,它实现了流量控制。通过这一机制,接收方可以通知发送方其缓冲区的可用空间,发送方则根据这些信息调整数据的发送速率。滑动窗口的核心功能是平衡发送方和接收方的数据传输速率,防止发送方发送的数据超出接收方的处理能力,从而避免接收方缓冲区溢出。

此外,滑动窗口机制允许发送方在未收到上一个数据包的确认(ACK)的情况下,继续发送多个数据包。这种做法提高了网络的吞吐量,减少了因等待确认而产生的延迟,从而实现了更高效的数据传输。

TCP拥塞控制

TCP拥塞控制是一组机制,旨在防止网络过载,同时最大化网络资源的利用效率。它通过动态调整数据传输速率来适应网络条件,确保网络不会因过多的未确认数据而发生拥塞。拥塞控制的核心在于拥塞窗口(Congestion Window, cwnd),它限制了未被确认的报文段的数量。

  • 慢启动(Slow Start):在连接建立初期,发送方以较慢的速度增加数据发送速率。拥塞窗口(cwnd)从一个最大报文段大小(MSS)开始,每次收到ACK后成倍增加,直到达到预设的慢启动阈值(ssthresh)或检测到网络拥塞迹象。

  • 拥塞避免(Congestion Avoidance):一旦cwnd达到ssthresh,TCP进入拥塞避免阶段,cwnd的增长模式从指数增长变为每个往返时间(RTT)增加一个MSS的线性增长。这一阶段的目的是温和地探测网络容量,以维持网络的稳定性。

  • 快速重传(Fast Retransmit):当发送方收到三个或更多重复的ACK时,它会立即重传疑似丢失的报文段,而不必等待超时。这一机制减少了重传延迟,加快了对数据丢失的响应。

  • 快速恢复(Fast Recovery):在执行快速重传后,TCP不会回到慢启动状态,而是将cwnd减半至ssthresh,并开始线性增长cwnd,以迅速恢复到丢包前的传输速率。这种方法允许TCP更快地从丢包事件中恢复,同时避免了不必要的性能下降。

TCP与UDP

TCP和UDP区别

  • 连接性:TCP是面向连接的协议,数据传输前必须建立连接;UDP无需建立连接,可立即传输数据。

  • 服务模式:TCP提供一对一服务,每条连接仅连接两个端点;UDP支持一对一、一对多、多对多的通信模式。

  • 可靠性:TCP提供可靠的数据传输,确保数据无误差、不丢失、不重复且按序到达;UDP尽力而为的传输,不保证数据的可靠交付。

  • 拥塞控制与流量控制:TCP具备拥塞控制和流量控制机制,以确保数据传输的稳定性;UDP缺乏这些机制,即使网络拥堵,也不会影响UDP的发送速率。

  • 头部开销:TCP头部长度较长,通常为20字节,若使用选项字段则更长;UDP头部固定为8字节,开销较小。

  • 传输方式:TCP流式传输,无边界,但保证数据顺序和可靠性;UDP分包传输,有边界,但可能导致数据包丢失和乱序。

  • 分片处理:TCP数据大于最大段大小(MSS)时,在传输层分片,接收端在传输层重组。若分片丢失,仅需重传丢失的分片;UDP数据大于最大传输单元(MTU)时,在IP层分片,接收端在IP层重组。若分片丢失,实现可靠传输的UDP需重传所有数据包,效率较低。因此,UDP报文通常应小于MTU。

TCP和UDP的应用场景 

TCP:由于其面向连接的特性以及对数据可靠交付的保证,TCP常用于需要高可靠性的应用,如:

  • FTP:文件传输协议,需要确保文件数据的完整性和顺序。

  • HTTP/HTTPS:超文本传输协议及其安全版本,用于网页浏览,要求数据的准确传输。

UDP:由于其无连接的特性,能够即时发送数据,且处理简单高效,UDP常用于以下场景:

  • 数据包总量较少的通信:DNS(域名系统)和SNMP(简单网络管理协议),这些应用对实时性要求高,而对数据丢失的容忍度也较高。
  • 多媒体通信:如视频和音频流,这些应用需要快速传输,即使偶尔丢包也不会显著影响用户体验。
  • 广播通信:UDP支持一对多的广播通信,适用于需要向多个接收者发送相同数据的场景。

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

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

相关文章

0004.基于springboot+elementui的在线考试系统

适合初学同学练手项目,部署简单,代码简洁清晰; 愿世界和平再无bug 一、系统架构 前端:vue| elementui 后端:springboot | mybatis-plus 环境:jdk1.8 | mysql | maven 二、登录角色 1.管理员 2.老师 …

[面试题]--索引用了什么数据结构?有什么特点?

答:使用了B树: 时间复杂度:O(logN),可以有效控制树高 B树特点: 1.叶子节点之间有相互链接的作用,会指向下一个相近的兄弟节点。 MySQL在组织叶子节点使用的是双向链表 2.非叶子节点的值都保存在叶子节点当中 MySQL非叶…

ansible剧本快速上手

playbook剧本介绍 是什么:能户长期保存,且能实现批量配置、部署…的文件格式:yaml格式。用 空格 冒号 头号 句号语法检测:ansible-playbook --syntax-check install-zabbix.yaml或则 -C检测取消默认任务:gather_facts…

Element plus 下拉框组件选中一个选项后显示的是 value 而不是 label

最近刚进行 Vue3 Element plus 项目实践&#xff0c;在进行表单二次封装的时候&#xff0c;表单元素 select 下拉框组件选中一个选项后显示的是 value 而不是 label&#xff0c;下面上代码&#xff1a; 原来的写法&#xff1a; <el-selectv-if"v.type select"…

重新定义页签!Choerodon UI Tabs让管理更高效

01 引言 Tabs 组件通过提供平级区域&#xff0c;将大块内容进行有效的收纳和展现&#xff0c;从而保持界面整洁。但在企业应用的快速发展中&#xff0c;这样传统的页签组件已无法满足我们对界面布局和个性化展示的追求。Choerodon UI Tabs 组件通过支持多级分组、个性化配置、…

Eureka学习笔记-服务端

Eureka学习笔记 服务端 模块设计 Resources &#xff1a;这部分对外暴露了一系列的 Restful 接口。Eureka Client 的注册、心跳、获取服务列表等操作都需要调用这些接口。另外&#xff0c;其他的 Server 在同步 Registry 时也需要调用这些接口。Controller &#xff1a;这里提…

Java创建对象有几种方式?

大家好&#xff0c;我是锋哥。今天分享关于【Java创建对象有几种方式?】面试题。希望对大家有帮助&#xff1b; Java创建对象有几种方式? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Java 中&#xff0c;创建对象的方式主要有几种。以下是常见的几种对象创…

C++特殊类设计(单例模式等)

目录 引言 1.请设计一个类&#xff0c;不能被拷贝 2. 请设计一个类&#xff0c;只能在堆上创建对象 为什么设置实例的方法为静态成员呢 3. 请设计一个类&#xff0c;只能在栈上创建对象 4. 请设计一个类&#xff0c;不能被继承 5. 请设计一个类&#xff0c;只能创建一个对…

[LeetCode-Python版]21. 合并两个有序链表(迭代+递归两种解法)

题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出&#x…

【C++】- 掌握STL List类:带你探索双向链表的魅力

文章目录 前言&#xff1a;一.list的介绍及使用1. list的介绍2. list的使用2.1 list的构造2.2 list iterator的使用2.3 list capacity2.4 list element access2.5 list modifiers2.6 list的迭代器失效 二.list的模拟实现1. list的节点2. list的成员变量3.list迭代器相关问题3.1…

Facebook的隐私保护政策:用户数据如何在平台上被管理?

在当今数字化世界&#xff0c;社交平台如何管理用户数据并保护隐私成为了一个热点话题。作为全球最大的社交网络&#xff0c;Facebook&#xff08;现Meta&#xff09;在数据隐私方面的政策备受关注。本文将简要介绍Facebook的隐私保护措施&#xff0c;以及用户数据如何在平台上…

Git-分支(branch)常用命令

分支 我们在做项目开发的时候&#xff0c;无论是软件项目还是其他机械工程项目&#xff0c;我们为了提高效率以及合理的节省时间等等原因&#xff0c;现在都不再是线性进行&#xff0c;而是将一个项目抽离出诸进行线&#xff0c;每一条线在git中我们就叫做分支&#xff0c;bran…

0101多级nginx代理websocket配置-nginx-web服务器

1. 前言 项目一些信息需要通过站内信主动推动给用户&#xff0c;使用websocket。web服务器选用nginx&#xff0c;但是域名是以前通过阿里云申请的&#xff0c;解析ip也是阿里云的服务器&#xff0c;甲方不希望更换域名。新的系统需要部署在内网服务器&#xff0c;简单拓扑图如…

Android Stduio 2024版本设置前进和后退按钮显示在主界面

Android Studio 2024&#xff08;Ladybug&#xff09;安装后发现前进和后退按钮不显示在主界面的工具栏&#xff0c;且以前在View中设置的办法无效&#xff1a; Android Studio 2024&#xff08;Ladybug&#xff09;的设置方式&#xff1a; File->Settings->Appearance&…

【C++算法】48.分治_归并_数组中的逆序对

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a;图解 题目链接&#xff1a; 剑指 Offer 51. 数组中的逆序对 题目描述&#xff1a; 解法 解法一&#xff1a;暴力解法&#xff1a;暴力枚举 两层for循环 本题不能用&#xff0c;用了会超时。 解法…

少样本学习之CAML算法

上下文感知元学习&#xff08;Context-Aware Meta-Learning, CAML&#xff09; 概述 在机器学习和深度学习领域&#xff0c;元学习&#xff08;Meta-Learning&#xff09;旨在通过学习如何学习&#xff0c;使模型能够在面对新任务时快速适应。传统的元学习方法通常需要在特定…

【ChatGPT】解锁AI思维链:如何让机器像人类一样思考?

在人工智能领域&#xff0c;我们一直在追求让机器像人类一样思考。然而&#xff0c;即使是最先进的AI&#xff0c;也常常被诟病缺乏“常识”&#xff0c;难以理解复杂问题&#xff0c;更不用说像人类一样进行逻辑推理和解决问题了。最经常的表现就是遇到不会的地方&#xff0c;…

leetcode 面试经典 150 题:长度最小的子数组

链接长度最小的子数组题序号209题型数组解题方法滑动窗口难度中等 题目 给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, …, numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件…

多进程并发跑程序:pytest-xdist记录

多进程并发跑程序&#xff1a;pytest-xdist记录 pytest -s E:\testXdist\test_dandu.py pytest -s testXdist\test_dandu.py pytest -s &#xff1a;是按用例顺序依次跑用例 pytest -vs -n auto E:\testXdist\test_dandu.py pytest -vs -n auto&#xff0c;auto表示以全部进程…

Vue2二、指令补充,computed 计算属性vs方法,watch 侦听器,

一、指令补充 1.修饰符。2.动态操作class。3.动态操作style。4.v-model 用于其他表单元素 1.修饰符 ① 按键修饰符 keyup.enter → 键盘回车监听 <body><div id"app"><h3>keyup.enter → 监听键盘回车事件</h3><input v-model"…