网络--传输层协议--TCP

devtools/2024/11/6 13:09:54/

1、TCP协议的特性

面向连接(需要建立连接,才能继续通信)

面向字节流的一对一通信模式

通过流量控制和拥塞控制 -> 确保可靠传输

报头大小20字节(若带选项,最大60字节)

2、TCP报文字段

16位源端口号 和 16位目的端口号 -- 2 + 2 = 4 字节

32位序号 和 32位确认序号 -- 4 + 4 = 8 字节

4位首部长度 -- 6位保留标志位 -- 共占 2字节

16位窗口大小 -- 2字节

16位校验和 -- 2字节

16位紧急指针 -- 2字节

2.1、16位源端口号和16位目的端口号

标识:发送端的端口号和接收端的端口号

16位目的端口号,用于解包之后的分用给上层。

2.2、4位首部长度

4位首部长度的表示范围 - [0 , 15]

但是,在这里,规定单位是4字节 --> 因此,表示的范围为[0 , 60] 字节

通过4位首部长度,就可以用来进行解包:

1、读取报文前20字节(报头)

2、读取4位首部长度(报头+选项总长度)

3、计算4位首部长度表示的字节数(a * 4 = x),x字节

4、if x == 20  -- 没有选项; if x > 20 -- 带有选项(此时就可以提取选项了)

2.3、16位校验和&16位紧急指针 

16位校验和:用于检测数据是否传输正确

16位紧急指针:用于表示传输的数据中,哪一部分是紧急数据--> 优先处理。 其实就是某一段数据的其实地址,标识这段数据是紧急数据。

2.4、16位序号&16位确认序号

16位序号:TCP将每个字节的数据都进行了编号 -- 即序列号

 如何理解这个序号呢:

所谓的数据的序号,其实就是发送方的发送缓冲区的数组下标!!

因此,在这,发送缓冲区和接收缓冲区的大小也就是序号的最大值了:2^16 - 1 = 65535

16位确认序号:用来告知发送方,哪些数据已经被收到了,并告知对方从哪里开始继续发送数据。

比如:确认序号为3001,代表3000及其以前的数据,我都收到了(序号为1-3000的数据我都收到了),之后从序号为3001开始继续往后发送。

 问题:这样看来其实只需要16位序号,就能保证上述需求了,为什么还要一个16位确认序号啊?

TCP是全双工协议:在发送应答的时候,还可以发送数据(那么此时,既需要确认序号,也需要序号)。

 2.5、6位保留标志位

ACK:应答标志位

URG:标识16位紧急指针是否有效

PSH:催促接收方赶快拿走接收缓冲区的数据

SYN:请求建立连接

RST:请求重新建立连接

FIN:通知对方,本端即将断开连接(关闭)

3、TCP保证数据传输可靠性的策略

3.1、确认应答机制 - ACK标志位

在A-B通信时,A端发送数据之后,无论B端是否要回文,B端都必须返回一个报文,其中将ACK标志位置一,标识确认应答;

A端收到报文,方知对方收到了报文。

(只要发送方收到应答,就认为确认应答,接收方不用收到应答)

 问题来了:假设A方发送了4个报文,而只收到B方的3个应答,如何确认是哪个报文丢失了呢?

结合应答中的16位确认序号,方知哪些数据被收到(反之,就知道哪些数据没有被收到)

3.2、捎带应答机制 

因为TCP是全双工的,在接收数据的时候,也可以发送数据。

由于确认应答机制的存在,强迫接收方必须发送应答。

因此,为了提高通信效率,


http://www.ppmy.cn/devtools/131765.html

相关文章

Java开发配置文件的详情教程配置文件类型

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把手教你开发炫酷的vbs脚本制作(完善中……) 4、牛逼哄哄的 IDEA编程利器技巧(编写中……) 5、面经吐血整理的 面试技…

vue使用方法创建组件

vue 中 创建 组件 使用 方法创建组件 vue2 中 import vueComponent from xxxx function createFn(){const creator Vue.extend(vueComponent);const instance new creator();document.appendChild(instance.$el); }vue3 中 import { createApp } from "vue"; im…

刘艳兵-DBA026-以下哪些HINT是有效的?

以下哪些HINT是有效的? A INDEX_FFS B INDEX_RS C NO_INDEX_FFS D NO_INDEX_RS 答: A INDEX_FFS C NO_INDEX_FFS INDEX_FFS 用于提示优化器对表执行快速全索引扫描(Fast Full Index Scan)。 NO_INDEX_FFS 用于…

【大数据学习 | kafka】producer之拦截器,序列化器与分区器

1. 自定义拦截器 interceptor是拦截器&#xff0c;可以拦截到发送到kafka中的数据进行二次处理&#xff0c;它是producer组成部分的第一个组件。 public static class MyInterceptor implements ProducerInterceptor<String,String>{Overridepublic ProducerRecord<…

精美的美食食谱分享首页

效果图&#xff1a; 完整代码&#xff0c;图片素材如下&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&…

Melty 主体流程图

┌───────────┐ │ 用户输入 │ └─────┬─────┘ │&#xff08;自然语言或指令&#xff09; │ ▼ ┌───────────┐ │ 自然语言处理 │ │ &#xff08;NLU 模块&#xff09;│ └─────┬─────┘ │ │ 解析用户意图 │ ▼ ┌─…

简单的 docker 部署ELK

简单的 docker 部署ELK 这是我的运维同事部署ELK的文档&#xff0c;我这里记录转载一下 服务规划 架构: Filebeat->kafka->logstash->ES kafka集群部署参照: kafka集群部署 部署服务程序路径/数据目录端口配置文件elasticsearch/data/elasticsearch9200/data/elas…

Java对象-在内存中是怎样执行的?

首先&#xff0c;java程序是在JVM中跑的&#xff0c;而JVM是在内存中执行的&#xff0c;虚拟机为了更好的执行程序&#xff0c;会把内存划分为三个区域&#xff0c;栈内存&#xff0c;堆内存&#xff0c;方法区&#xff0c;其中方法区用来存放类文件 class Student{String nam…