当前位置: 首页 > news >正文

Java面试题-UDP\TCP\HTTP

UDP

UDP特性

(1)UDP是无连接的:发送数据之前不需要像TCP一样建立连接,也不需要释放连接,所以减少了发送和接收数据的开销
(2)UDP 使用尽最大努力交付:即不保证可靠交付
(3) UDP是面向报文的。UDP在发送数据时会将数据划分为一个个报文(既不合并,也不分拆),每个报文都有自己的边界。这意味着在接收端,可以轻松地将每个报文视为独立的消息。这有助于接收端明确地识别每个消息的开始和结束。
在这里插入图片描述
(4)UDP支持一对一、一对多、多对一的交互通信。
(5)UDP首部开销比较小,只有八字节。

UDP报文格式

用户UDP由两部分组成:分别是首部+数据部分。首部包括了源端口、目标端口、长度以及校验和(这四项是八字节)。
包括源IP地址、目标IP地址、UDP长度这些是IP首部,可以称伪首部。

长度:UDP用户数据报文的长度,最小值为8
校验和:检验UDP正确性的

在这里插入图片描述

每一部分如下所示
在这里插入图片描述

UDP常见应用

UDP(User Datagram Protocol)常用于需要高性能、低延迟和快速数据传输的场景,尤其是在网络应用中,需要处理实时性要求较高、可容忍一定数据丢失的情况。以下是一些常见的UDP使用场景:

实时多媒体流: UDP适用于音频和视频流传输,如实时音频和视频通话、音视频会议、在线游戏的语音通信等。在这些场景中,速度和低延迟比数据的100%可靠性更为重要。
DNS解析: 域名系统(DNS)通常使用UDP来查询域名解析,因为DNS查询需要快速的响应时间,而且可以容忍一些数据包的丢失。
网络广播和多播: UDP支持广播和多播通信,这使得它在需要将数据广播到多个接收者的场景中非常有用,如视频直播和网络广播。
实时定位服务: 实时定位和地理位置服务(如GPS定位)使用UDP来快速传递位置信息,以确保地理位置信息的及时性。
传感器数据: UDP适用于传感器网络,其中传感器数据需要快速传输并及时处理,但不一定需要100%的数据可靠性。
网络游戏: 在在线游戏中,UDP通常用于快速传输游戏状态和玩家输入,因为延迟是游戏性能的关键因素。

TCP

具体的报文格式:
源端口和目标端口无需多言;
序号和确认号:保证TCP协议的可靠传输,

序号(Sequence Number):用于标记TCP数据包中的字节流序列号
每个TCP数据包都包含一个序号,它表示发送端发送的字节流的第一个字节的序列号。
接收端使用序号来将TCP数据包按顺序重新组装,以确保数据的顺序交付。如果数据包丢失或乱序到达,接收端可以使用序号来重组数据。
序号还用于检测重复数据包,因为每个数据包都有一个唯一的序号。

确认号(Acknowledgment Number):
确认号字段表示接收端期望接收的下一个字节的序列号。它指示了接收端已成功接收并准备好接收序号为确认号的字节之后的数据。
发送端会根据确认号来知道哪些数据已经被接收,哪些数据还需要重传。如果发送端收到确认号,它会知道接收端已成功接收数据,并可以继续发送下一批数据。

在这里插入图片描述

TCP的三次握手

在这里插入图片描述
1) 第一次握手(SYN,Seq=X(序列号))
- 客户端发送一个带有SYN(同步序列编号)标志的TCP数据包给服务器
- 数据包中包含一个初始序列号Seq=X
- 客户端进入“SYN_SENT”状态等待服务器确认
2) 第二次握手 (SYN,ACK,Seq=Y, Ack=X+1)
- 服务器端接收到客户端请求后,发回一个确认(ACK)数据包。
- 这个数据包中包含了SYN、ACK标志,表示服务器已经接收了客户端的请求,并准备好建立连接。
- 服务器也会分配一个自己的初始序列号Seq=Y,来表示服务器发送的数据初始序列号
- 通过ACK字段中的Ack=X+1表示自己接收到的Seq为X
- 同时发送Ack=X+1表示,服务器端下一个期望接收到的Seq序列号为Seq=X+1
3) 第三次握手(ACK,Ack=Y+1,Seq=X+1)
- 接收到Seq后,返回确认信息Ack=Y+1,下一个期望接收到的序列号为Y+1
- 服务器接收到客户端的确认后,进入"ESTABLISHED"状态,而客户端也进入"ESTABLISHED"状态。

TCP的四次挥手

在这里插入图片描述

1)第一次挥手(客户端发送FIN)

  • 客户端首先决定关闭连接,他发送一个数据包TCP,其中包含FIN标志位
  • 这个FIN告诉服务端,自己没有多余的数据要发送了,但是仍然可以接收数据
  • 同时包含Seq=u
  • 自己进入FIN-WAIT关闭等待状态
    2)第二次挥手(服务端发送ACK)
  • 服务端接收到客户端的FIN后,需要里面回复一条带有ACK的确认位
  • 由于收到的Seq=u,所以返回ACK以及Ack=u+1
  • 同时自己也发送一个seq=v,到客户端
  • 自己进入CLOSE-WAIT 关闭等待状态
    -----------过了一段时间---------
    3)第三次挥手(服务端发送FIN)
  • 服务端准备关闭连接了,所以主动向客户端发送FIN请求,其中发送FIN、ACK
  • 同时还发送自己的Seq=w等待确认,Ack=u+1对上一条的回复
  • 此时服务端进入LAST-ACK最后确认状态
    4) 第四次挥手(客户端发送ACK)
  • 客户端接收到消息后发送一个ACK以进行确认,同时发送Seq=u+1对上一条Ack进行回复,ack=w+1对上一条Seq进行确认。

第一次挥手:A 说“我没啥要说的了”
第二次挥手:B 回答“我知道了”,但是 B 可能还会有要说的话,A 不能要求 B 跟着自己的节奏结束通话
第三次挥手:于是 B 可能又巴拉巴拉说了一通,最后 B 说“我说完了”
第四次挥手:A 回答“知道了”,这样通话才算结束。


为什么要设计成三次握手?

这个题重点在于回答三次握手和两次握手的区别。(四次握手或者更多你就可以直接说,如果三次握手能够解决问题,四次、五次更多的连接就是浪费资源,没必要)

第一个原因避免历史连接

RFC 793 指出:The principle reason for the three-way handshake is to prevent old duplicate connection initiations from causing confusion.

两次握手场景下,客户端先后发送了两端连接请求,Seq=X和Seq=Y,那由于Seq=Y是后发送的,所以客户端更希望自己收到的是Ack=Y+1,但是Seq=X会先到达服务端,服务端会根据SYN和Seq=X,向客户端回消息,Ack=X+1,此时,客户端会认为连接已经建立(两次连接嘛)。所以开始向客户端发送消息。客户端发现自己收到了Ack=Y+1知道不是自己期望的,所以会要求连接中断。

在这个场景下服务端向客户端发送了无用的数据

在这里插入图片描述
第二个原因维持双向的序列号
两次握手场景中,服务端发送了ACK和Ack=X+1后就开始发送数据了,此时服务端不知道客户端有没有收到自己的确认消息。不能维持双向连接的基本需求。

四次挥手时报文丢失

1.第一次挥手报文丢失

客户端调用close函数,就会向服务端发送FIN报文,试图与服务端断开连接,此时客户端进入了Fin_WAIT状态。
如果客户端一直没有收到Ack应答报文,就会触发超时重传机制(有最大次数限制)。超过最大次数,就不再发送报文,直接进入close状态。

2.第二次挥手报文丢失

当接收到客户端的FIN报文,就会先回应一个ack报文,此时服务端进入了CLOS_WAIT状态。
客户端不会收到服务器的确认消息,所以客户端仍然可以发送数据。
服务端需要等待客户端的重传FIN以开始继续挥手。

3.第三次挥手报文丢失

服务器发送带有FIN标志的数据包以请求关闭连接,但是数据包丢失。
客户端不知道服务端已经请求关闭连接,仍然可以发送数据
服务器需要等待客户端的确认ACK,然后重传FIN以开始新的挥手过程。

4.第四次挥手报文丢失

客户端接收到服务器的FIN后,发送带有ACK标志的数据包,但该数据包丢失
服务器不知道客户端已经确认关闭连接,但仍然不能再发送数据。
客户端可能需要等待服务器的FIN重传,然后重新发送ACK以继续挥手过程。

挥手之后为什么需要TIME_WAIT状态

1) 保证双方能够正常关闭:如果没有TIME_WAIT状态的话,客户端最后一次发送ack应答报文后就进入了close阶段。如果服务端没有收到ack报文的话,就会重传FIN报文,而此时客户端已经close了,就会返回一个RST错误报文。
而有了TIME_WAIT状态的话,客户端并不会着急关闭,而是等待了2MSL再关闭,这样的话就算重传的fin报文也能正确响应,保证了服务端的正确关闭
2)防止旧连接的数据干扰新连接:假设没有TIME_WAIT状态,那么在关闭连接前有个报文被延迟了。关闭后,又重新建立了相同四元组的连接,此时前一个被延迟的数据包到达了(没有到达最大生存时间),并且正好在接收窗口内,那么服务端就会错误接收,使得数据混乱。
而TIME_WAIT就是帮助客户端和服务端删除两边的一个历史都被正常丢弃,不干扰新的连接

为什么第四次挥手客户端需要等待 2*MSL(报文段最长寿命)时间后才进入 CLOSED 状态

第四次挥手时,客户端发送给服务器的 ACK 有可能丢失,如果服务端因为某些原因而没有收到 ACK 的话,服务端就会重发 FIN,如果客户端在 2*MSL 的时间内收到了 FIN,就会重新发送 ACK 并再次等待 2MSL,防止 Server 没有收到 ACK 而不断重发 FIN。

HTTP协议

超文本传输协议(HTTP,HyperText Transfer Protocol) 是一种用于传输超文本和多媒体内容的协议,主要是为 Web 浏览器与 Web 服务器之间的通信而设计的。当我们使用浏览器浏览网页的时候,我们网页就是通过 HTTP 请求进行加载的。HTTP 使用客户端-服务器模型,客户端向服务器发送 HTTP Request(请求),服务器响应请求并返回 HTTP Response(响应)。

HTTP 协议大部分是基于 TCP 协议(注HTTP3.0是基于UDP的,HTTP2.0和HTTP1.0是基于TCP协议的), HTTP 协议是”无状态”的协议,它无法记录客户端用户的状态,一般我们都是通过 Session 来记录客户端用户的状态。

HTTP协议一些更具体的内容可以看这里

HTTP协议和HTTPS协议区别

HTTP(Hypertext Transfer Protocol):

  1. 不安全传输: HTTP是一种不安全的协议,传输的数据在传输过程中是明文可见的。这意味着敏感信息,如用户名、密码、信用卡号等,可能会在传输过程中被攻击者拦截和窃取。
  2. 端口号: HTTP默认使用端口号80来进行通信。
  3. URL以http://开头: HTTP的URL通常以"http://"开头。

HTTPS(HTTP Secure):

  1. 安全传输: HTTPS是一种安全的协议,它使用SSL/TLS(Secure Sockets Layer/Transport Layer Security)来加密传输的数据,确保数据在传输过程中是加密的,难以被窃取。
  2. 端口号: HTTPS默认使用端口号443来进行通信。这个端口号是经过加密的,与HTTP的80端口有区别。
  3. URL以https://开头: HTTPS的URL通常以"https://"开头。

HTTP1.1协议和HTTP1.0协议区别

首先这里我们需要巩固一下HTTP的典型特征

  1. 明文的、文本协议,而不是2进制协议,人可以看懂里面的聂荣
  2. 消息是一来一回的。即客户端发起一个TCP连接,在连接上面发一个HTTP Request到服务器,服务器返回一个HTTP Response,然后连接关闭。每来一个请求久开一个连接,请求完了久关闭连接。

根据上面的特性其实HTTP最典型的问题就是性能问题,连接的建立和关闭都是耗时的。对于一个网页来说,除了页面本身的请求,页面里的JS、CSS、img资源都是一个个HTTP请求。一个页面有十几个资源甚至是几十个都是很常见的。这种连接+关闭是非常消耗时间的。

  1. HTTP1.1引入了持久连接,允许在一个连接上处理多个请求和响应,降低了建立和关闭连接的开销,提高了性能。
  2. 引入了管道的机制没在一个请求发出去后,响应没有收到之前,就可以发送下一个,再下一个请求,提高了同一个TCP连接上的请求处理效率。
    在这里插入图片描述
  3. HTTP 1.1 支持头部信息的压缩,减少了传输的数据量,提高了效率。
  4. HTTP 1.1 引入了主机头部,使得一台服务器可以托管多个域名,从而支持虚拟主机。

相关文章:

Java面试题-UDP\TCP\HTTP

UDP UDP特性 (1)UDP是无连接的:发送数据之前不需要像TCP一样建立连接,也不需要释放连接,所以减少了发送和接收数据的开销 (2)UDP 使用尽最大努力交付:即不保证可靠交付 &#xff0…...

使用WPF模仿Windows记事本界面

本次仅模仿Windows记事本的模样&#xff0c;并未实现其功能。 所有代码如下&#xff1a; <Window x:Class"控件的基础使用.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/…...

【目标检测】Co-DETR:ATSS+Faster RCNN+DETR协作的先进检测器(ICCV 2023)

论文&#xff1a;DETRs with Collaborative Hybrid Assignments Training 代码**&#xff1a;https://github.com/Sense-X/Co-DETR 文章目录 摘要一、简介二、本文方法2.1.概述2.2.协同混合分配训练2.3. 定制的正 Query 生成2.4. Co-DETR为何有效1、丰富编码器的监督2、通过减少…...

iOS QQ登录SDK升级后报错Duplicate interface definition for class ‘TencentOAuth‘修复

起因 最近发现QQ登录SDK sdk-Lite3.3.8 TencentOpenAPI 在部分手机上会崩溃到初始化位置_tencentOAuth [[TencentOAuth alloc] initWithAppId:appid andDelegate:self];&#xff0c; 比如&#xff1a;iPhone6p 版本12.5.4&#xff0c;iPhone8p 版本14.1&#xff0c;iPad版本1…...

laravel中锁以及事务的简单使用

一、首先来说一下什么是共享锁&#xff1f;什么是排他锁&#xff1f; 共享&#xff1a;我可以读 写 加锁 , 别人可以 读 加锁。 排他&#xff1a;只有我 才 可以 读 写 加锁 , 也就是说&#xff0c;必须要等我提交事务&#xff0c;其他的才可以操作。 二、简单例子实现加锁 锁…...

Vue+openlayers+projs4实现坐标转换

一、背景 有一堆点数据&#xff0c;需要在地图上标记&#xff0c;只知参考北京54坐标系或西安80坐标系&#xff0c;但具体是哪种不清楚&#xff0c;这时候就需要坐标转换。ps&#xff1a;EPSG&#xff1a;3857&#xff08;openlayers参照的坐标系&#xff09; 二、思路 1、研…...

09 创建型模式-建造者模式

1.建造者模式介绍&#xff1a; 建造者模式 (builder pattern), 也被称为生成器模式 , 是一种创建型设计模式 定义: 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不 同的表示。 2.建造者模式要解决的问题 建造者模式可以将部件和其组装过程分开&am…...

4.9 多协议标记交换MPLS

思维导图&#xff1a; 前言&#xff1a; **4.9 多协议标记交换MPLS笔记** 1. **定义与背景**&#xff1a; - MPLS (多协议标记交换) 是一种由 IETF 开发的新协议。 - “多协议”意味着 MPLS 的上层可以使用多种协议。 - 该协议综合了多家公司的技术&#xff0c;如 C…...

【经历】在职8个月->丰富且珍贵

在职8个月->丰富且珍贵 2021-3~2021-11&#xff1a;面试进入一家做400电话的公司&#xff0c;我进入公司时&#xff0c;加上我只有四个人(老板、人事、业务)&#xff0c;开发只有我&#xff0c;所以&#xff1a;产品~设计~前端~后端~测试~上线~维护~培训&#xff0c;只有我自…...

使用GH(命令行)在本地提出Github上的issue、PR,合并PR

使用GH&#xff08;命令行&#xff09;在本地提出Github上的issue、PR&#xff0c;合并PR 前言 Github上的一些操作使用Git命令是无法完成的&#xff0c;因此正常流程就是在网页端进行。等一下&#xff0c;你让程序员用网页进行&#xff1f;果然&#xff0c;有命令行工具可以…...

@Scheduled定时器

Scheduled定时器 一、基本使用二、参数说明fixedDelayfixedRateinitialDelaycron 三、cron 表达式参数说明实用性的案例 四、Scheduled注意事项五、配置文件1、fixedDelay2、fixedRate3、cron 一、基本使用 Scheduled // 由Spring定义&#xff0c;用于将方法设置为调度任务。…...

Xshell+screen解决ssh连接 服务器掉线的问题

Linux screen命令解决SSH远程服务器训练代码断开连接后运行中断_linux screen ssh-CSDN博客 Linux命令之screen命令_linux screen_恒悦sunsite的博客-CSDN博客 使用教程&#xff1a; 这里粗略介绍一下 &#xff08;1&#xff09;xshell xftp&#xff08;xshell点这个&#…...

coding_v3

面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 数组/字符串 1.LC88【合并两个有序数组】 def solve(nums1, m, nums2, n):p1, p2 m-1, n-1tail m n -1while p1 > 0 or p2 > 0:if p1 -1:nums1[tail] nums2[p2]p2…...

Elasticsearch:什么是余弦相似度?

余弦相似度是数据科学、文本分析和机器学习领域的基本概念。 如果你想知道什么是余弦相似度或者它如何在现实世界的应用程序中使用&#xff0c;那么你来对地方了。 本指南旨在让你深入了解相似性是什么、其数学基础、优点及其在不同领域的各种应用。读完本指南后&#xff0c;你…...

【每日一题Day352】LC1726同积元组 | 哈希表+排列组合

同积元组【LC1726】 给你一个由 不同 正整数组成的数组 nums &#xff0c;请你返回满足 a * b c * d 的元组 (a, b, c, d) 的数量。其中 a、b、c 和 d 都是 nums 中的元素&#xff0c;且 a ! b ! c ! d 。 思路 求出所有二元组的积及其出现次数&#xff0c;假设某个积出现的次…...

react中在js文件里定义的变量,如何在less文件里去使用该变量

在 React 中&#xff0c;如果在 JS 文件中定义了变量&#xff0c;可以使用 CSS Modules 的方式将变量导出到 LESS 文件中。 以下是示例代码&#xff1a; // index.js import React from react; import styles from ./styles.module.less;const color red;function App() {re…...

TIA博途中通过SCATTER指令实现将字节BYTE拆分成单个位的具体方法示例

TIA博途中通过SCATTER指令实现将字节BYTE拆分成单个位的具体方法示例 例如: 我们想判断某个字节中各个位的状态是1还是0 ,如何实现呢? 这里介绍通过SCATTER指令拆分字节的方法,仅供大家参考。 首先,我们先了解以下SCATTER指令的基本功能和使用方法: 如下图所示,在基本指…...

网络协议--ARP:地址解析协议

4.1 引言 本章我们要讨论的问题是只对TCP/IP协议簇有意义的IP地址。数据链路如以太网或令牌环网都有自己的寻址机制&#xff08;常常为48 bit地址&#xff09;&#xff0c;这是使用数据链路的任何网络层都必须遵从的。一个网络如以太网可以同时被不同的网络层使用。例如&#…...

pdf导出实例(itestpdf)

依赖 <!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf --><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.10</version></dependency>工具类 package or…...

关于CW32单片机pack包安装 KEIL IAR

CW32 系列微控制器软件开发工具入门 芯片包 1. 下载芯片包 官方下载链接&#xff1a;武汉鑫源半导体 2. 安装芯片包 双击芯片包.pack文件 支持 CW32F 系列的 IDE 支持 CW32F 系列的工具链&#xff1a; • • EWARM v7.70 或更高版本 MDK-ARM v5.17 或更高版本 2.1 EW…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...