网络面试题-UDPTCP
1 UDP
1.1 ⾯向报⽂
- UDP 是⼀个⾯向报⽂(报⽂可以理解为⼀段段的数据)的协议。意思就是UDP 只是报⽂的搬运⼯,不会对报⽂进⾏任何拆分和拼接操作
具体来说
- 在发送端,应⽤层将数据传递给传输层的 UDP 协议, UDP 只会给数据增加⼀个 UDP头标识下是 UDP 协议,然后就传递给⽹络层了
- 在接收端,⽹络层将数据传递给传输层, UDP 只去除 IP 报⽂头就传递给应⽤层,不会任何拼接操作
1.2 不可靠性
- UDP 是⽆连接的,也就是说通信不需要建⽴和断开连接。
- UDP 也是不可靠的。协议收到什么数据就传递什么数据,并且也不会备份数据,对⽅能不能收到是不关⼼的
- UDP 没有拥塞控制,⼀直会以恒定的速度发送数据。即使⽹络条件不好,也不会对发送速率进⾏调整。这样实现的弊端就是在⽹络条件不好的情况下可能会导致丢包,但是优点也很明显,在某些实时性要求⾼的场景(⽐如电话会议)就需要使⽤ UDP ⽽不是 TCP
1.3 ⾼效
- 因为 UDP 没有 TCP 那么复杂,需要保证数据不丢失且有序到达。所以 UDP 的头部开销⼩,只有⼋字节,相⽐ TCP 的⾄少⼆⼗字节要少得多,在传输数据报⽂时是很⾼效的
头部包含了以下⼏个数据
- 两个⼗六位的端⼝号,分别为源端⼝(可选字段)和⽬标端⼝ 整个数据报⽂的⻓度
- 整个数据报⽂的检验和( IPv4 可选 字段),该字段⽤于发现头部信息和数据中的错误
1.4 传输⽅式
- UDP 不⽌⽀持⼀对⼀的传输⽅式,同样⽀持⼀对多,多对多,多对⼀的⽅式,也就是说 UDP 提供了单播,多播,⼴播的功能
2 TCP
2.1 头部
- TCP 头部⽐ UDP 头部复杂的多
- 对于 TCP 头部来说,以下⼏个字段是很重要的
- Sequence number ,这个序号保证了 TCP 传输的报⽂都是有序的,对端可以通过序号顺序的拼接报⽂
- Acknowledgement Number ,这个序号表示数据接收端期望接收的下⼀个字节的编号是多少,同时也表示上⼀个序号的数据已经收到
- Window Size ,窗⼝⼤⼩,表示还能接收多少字节的数据,⽤于流量控制
标识符
- URG=1 :该字段为⼀表示本数据报的数据部分包含紧急信息,是⼀个⾼优先级数据报⽂,此时紧急指针有效。紧急数据⼀定位于当前数据包数据部分的最前⾯,紧急指针标明了紧急数据的尾部。
- ACK=1 :该字段为⼀表示确认号字段有效。此外, TCP 还规定在连接建⽴后传送的所有报⽂段都必须把 ACK 置为⼀ PSH=1 :该字段为⼀表示接收端应该⽴即将数据 push 给应⽤层,⽽不是等到缓冲区满后再提交。
- RST=1 :该字段为⼀表示当前 TCP 连接出现严重问题,可能需要重新建⽴ TCP 连接,也可以⽤于拒绝⾮法的报⽂段和拒绝连接请求。
- SYN=1 :当 SYN=1 , ACK=0 时,表示当前报⽂段是⼀个连接请求报⽂。当 SYN=1 ,ACK=1 时,表示当前报⽂段是⼀个同意建⽴连接的应答报⽂。
- FIN=1 :该字段为⼀表示此报⽂段是⼀个释放连接的请求报⽂
2.2 状态机
- HTTP 是⽆连接的,所以作为下层的 TCP 协议也是⽆连接的,虽然看似
- TCP 将两端连接了起来,但是其实只是两端共同维护了⼀个状态
- TCP 的状态机是很复杂的,并且与建⽴断开连接时的握⼿息息相关,接下来就来详细描述下两种握⼿。
- 在这之前需要了解⼀个重要的性能指标 RTT。该指标表示发送端发送数据到接收到对端数
据所需的往返时间
建⽴连接三次握⼿
- 在 TCP 协议中,主动发起请求的⼀端为客户端,被动连接的⼀端称为服务端。不管是客户端还是服务端, TCP 连接建⽴完后都能发送和接收数据,所以 TCP 也是⼀个全双⼯的协议。
- 起初,两端都为 CLOSED 状态。在通信开始前,双⽅都会创建 TCB 。 服务器创建完TCB 后遍进⼊ LISTEN 状态,此时开始等待客户端发送数据
第⼀次握⼿
客户端向服务端发送连接请求报⽂段。该报⽂段中包含⾃身的数据通讯初始序
号。请求发送后,客户端便进⼊ SYN-SENT 状态,x 表示客户端的数据通信初
始序号。
第⼆次握⼿
服务端收到连接请求报⽂段后,如果同意连接,则会发送⼀个应答,该应答中也会包含⾃身的数据通讯初始序号,发送完成后便进⼊ SYN-RECEIVED 状态。
第三次握⼿
当客户端收到连接同意的应答后,还要向服务端发送⼀个确认报⽂。客户端发完这个报⽂段后便进⼊ ESTABLISHED 状态,服务端收到这个应答后也进⼊ESTABLISHED 状态,此时连接建⽴成功。
- PS:第三次握⼿可以包含数据,通过 TCP 快速打开( TFO )技术。其实只要涉及到握⼿的协议,都可以使⽤类似 TFO 的⽅式,客户端和服务端存储相同 cookie ,下次握⼿时发出 cookie 达到减少 RTT 的⽬的
你是否有疑惑明明两次握⼿就可以建⽴起连接,为什么还需要第三次应答?
- 因为这是为了防⽌失效的连接请求报⽂段被服务端接收,从⽽产⽣错误
- 可以想象如下场景。客户端发送了⼀个连接请求 A,但是因为⽹络原因造成了超时,这时 TCP 会启动超时重传的机制再次发送⼀个连接请求 B。此时请求顺利到达服务端,服务端应答完就建⽴了请求。如果连接请求 A 在两端关闭后终于抵达了服务端,那么这时服务端会认为客户端⼜需要建⽴ TCP 连接,从⽽应答了该请求并进⼊ ESTABLISHED 状态。此时客户端其实是 CLOSED 状态,那么就会导致服务端⼀直等待,造成资源的浪费
- PS:在建⽴连接中,任意⼀端掉线,TCP 都会重发 SYN 包,⼀般会重试五次,在建⽴连接中可能会遇到 SYN FLOOD 攻击。遇到这种情况你可以选择调低重试次数或者⼲脆在不能处理的情况下拒绝请求
断开链接四次握⼿
TCP 是全双⼯的,在断开连接时两端都需要发送 FIN 和 ACK 。
第⼀次握⼿
- 若客户端 A 认为数据发送完成,则它需要向服务端 B 发送连接释放请求。
第⼆次握⼿
- B 收到连接释放请求后,会告诉应⽤层要释放 TCP 链接。然后会发送 ACK包,并进⼊ CLOSE_WAIT 状态,表示 A 到 B 的连接已经释放,不接收 A 发的数据了。但是因为 TCP 连接时双向的,所以 B 仍旧可以发送数据给 A。
第三次握⼿
- B 如果此时还有没发完的数据会继续发送,完毕后会向 A 发送连接释放请求,然后 B 便进⼊ LAST-ACK 状态。
- PS:通过延迟确认的技术(通常有时间限制,否则对⽅会误认为需要重传),可以将第⼆次和第三次握⼿合并,延迟 ACK 包的发送。
第四次握⼿
- A 收到释放请求后,向 B 发送确认应答,此时 A 进⼊ TIME-WAIT 状态。该状态会持续2MSL(最⼤段⽣存期,指报⽂段在⽹络中⽣存的时间,超时会被抛弃) 时间,若该时间段内没有 B 的重发请求的话,就进⼊ CLOSED 状态。当 B 收到确认应答后,也便进⼊CLOSED 状态。
为什么 A 要进⼊ TIME-WAIT 状态,等待 2MSL 时间后才进⼊ CLOSED 状态?
- 为了保证 B 能收到 A 的确认应答。若 A 发完确认应答后直接进⼊ CLOSED 状态,如果确认应答因为⽹络问题⼀直没有到达,那么会造成 B 不能正常关闭
相关文章:
网络面试题-UDPTCP
1 UDP 1.1 ⾯向报⽂ UDP 是⼀个⾯向报⽂(报⽂可以理解为⼀段段的数据)的协议。意思就是UDP 只是报⽂的搬运⼯,不会对报⽂进⾏任何拆分和拼接操作 具体来说 在发送端,应⽤层将数据传递给传输层的 UDP 协议, UDP 只会…...
在CSDN学Golang场景化解决方案(即时通讯goim)
一,支持单个、多个、广播消息推送 在goim中,用户可以通过维护长连接实现即时通讯功能,通过路由算法将消息发送给指定的客户端或群组。具体而言,goim支持以下三种方式进行消息推送: 单个推送:向某一个指定客…...
chrome插件开发实例02-使用content_scripts对用户浏览页面操作
目录 引言 chrome插件 插件演示 源代码 manifest.json content_scripts.js css设置(放在css文件夹下)<...
【Python目标识别】Labelimg标记深度学习(YOLO)样本
人工智能、ai、深度学习已经火了很长一段时间了,但是还有很多小伙伴没有接触到这个行业,但大家应该多多少少听过,网上有些兼职就是拿电脑拉拉框、数据标注啥的,其实这就是在标记样本,供计算机去学习。所以今天跟大家分…...
【雕爷学编程】MicroPython动手做(30)——物联网之Blynk 3
知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…...
C高级--day3(shell中的输入、命令置换符、数组、算数运算、分支结构)
#!/bin/bash pls ~/ -l | grep "^-" | wc -l qls ~/ -l | grep "^d" | wc -l echo "普通文件个数:$p" echo "目录文件个数:$q"#!/bin/bash read file posexpr index $file \. strexpr substr $file $((pos1)) 2…...
安防监控国标GB28181平台EasyGBS视频快照无法显示是什么原因?如何解决?
安防视频监控国标视频云服务EasyGBS支持设备/平台通过国标GB28181协议注册接入,并能实现视频的实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。平台部署简单、可拓展性强,支持将接入的视频流进行全终端、全平台分发ÿ…...
route命令 路由表 Linux Centos
route route命令在Linux中被用于显示和操纵IP路由表。然而,现在大部分Linux发行版都推荐使用ip route命令代替route,因为ip route提供更多的功能和更灵活的控制。 以下是route命令的基本用法: 查看路由表: route -n 这个命令显示当前机器的路…...
CMMI评审
CMMI评审 对于刚入行的朋友来说,可能对CMMI比较陌生。但对于工作多年的朋友来说,有可能都会接触过CMMI。那CMMI到底是什么? CMMI的全称为Capability Maturity Model Integration,即能力成熟度模型集成。对于软件行业,一般是指软件能力成熟度模型集成,是由美国国防部与卡内…...
深入了解 PostgreSQL 扩展插件
深入了解 PostgreSQL 扩展插件 在 PostgreSQL 数据库中,扩展插件是极具价值的工具,它们为我们提供了丰富多样的功能增强。本篇博客将深入介绍几个常用的 PostgreSQL 扩展插件,包括 pg_stat_statements、uuid、postgis 以及 postgis_raster。…...
记一次kernel patch(附开源贡献相关)
文章目录 开源操作系统流程手记smatch能发现的典型问题常见的修复方案附:偶然发现,unlikely函数搞开源贡献的一些捷径 开源操作系统 看了zhihu上的一些科普,明白二次开发是常见现象,套壳、抄袭、自研都不是很科学的说法。中外大厂…...
Pytorch Tutorial【Chapter 1. Basic operation of tensor】
Pytorch Tutorial 文章目录 Pytorch TutorialChapter 1. Basic operation of tensorReference Chapter 1. Basic operation of tensor 本节介绍有关张量Tensor的基本操作 Tensor相当于numpy中的ndarrays 创建空Tensor和全零Tensor,torch.zeros(d0,d1)类似于numpy…...
[环境配置]centos7安装vncserver
1. 首先,需要安装X Window System和GNOME桌面环境。可以通过以下命令进行安装: yum groupinstall "X Window System" yum groupinstall "GNOME Desktop" 2. 安装VNC服务器。可以通过以下命令进行安装: yum install ti…...
Excel功能总结
1)每一张表格上都打印表头 “页面布局”-->“打印标题”-->页面设置“工作表”页-->打印标题“顶端标题行” 如:固定第1~2行,设置成“$1:$2” 2)将页面内容打印在一页【缩印】 1.选好需要打印的区域,“页面布…...
用Rust实现23种设计模式之 组合模式
组合模式是一种结构型设计模式,它允许将对象组合成树状结构,并且能够以统一的方式处理单个对象和组合对象。以下是组合模式的优点和使用场景: 优点: 简化客户端代码:组合模式通过统一的方式处理单个对象和组合对象&a…...
opencv36-形态学操作-膨胀 cv2.dilate()
膨胀操作是形态学中另外一种基本的操作。膨胀操作和腐蚀操作的作用是相反的,膨胀操作能对图像的边界进行扩张。膨胀操作将与当前对象(前景)接触到的背景点合并到当前对象内,从而实现将图像的边界点向外扩张。如果图像内两个对象的…...
8266 ESP-07模块的使用 以及详细介绍
esp8266系列 陶瓷天线 版本 详细介绍说明 最近使用8266的ESP-01S做了个数据无线收发装置,发现板载天线信号太弱,装上外壳后信号更弱,因此考虑能否使用带有外接天线的模块代替ESP-01S。经过在安可信官网搜索发现,ESP07、ESP07S、ES…...
Linux之 centos、Ubuntu 安装常见程序 (-) Mysql 5.7 版本和8.0版本
CentOS 安装 MySql 注意 需要有root权限 安装5.7版本 – 由于MySql并不在CentOS的官方仓库中,所以需要通过rmp命令: 导入MySQL仓库密钥 1、配置MySQL的yum仓库 配置yum仓库 更新密钥 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 安装…...
【IDEA+Spark Streaming 3.4.1+Dstream监控套接字流统计WordCount保存至MySQL8】
【IDEASpark Streaming 3.4.1Dstream监控套接字流统计WordCount保存至MySQL8】 把DStream写入到MySQL数据库中 Spark 3.4.1MySQL 8.0.30sbt 1.9.2 文章目录 【IDEASpark Streaming 3.4.1Dstream监控套接字流统计WordCount保存至MySQL8】前言一、背景说明二、使用步骤1.引入库2…...
Dcat Admin 入门应用指南
在现代的网络应用开发中,管理后台是不可或缺的一部分。它为开发者提供了一个方便管理和监控应用数据的界面。而 Dcat Admin 是一个强大的管理后台框架,它基于 Laravel 框架开发,提供了丰富的功能和灵活的扩展性。本文将带您深入了解 Dcat Adm…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
