网络编程面试相关内容

news2025/1/11 18:40:17

1.什么是网络编程

网络编程的本质是多台计算机之间的数据交换。数据传递本身没有多大的难度,不就是把一个设备中的数据发送给其他设备,然后接受另外一个设备反馈的数据。现在的网络编程基本上都是基于请求/响应方式的,也就是一个设备发送请求数据给另外一个,然后接收另一个设备的反馈。在网络编程中,发起连接程序,也就是发送第一次请求的程序,被称作客户端(Client),等待其他程序连接的程序被称作服务器(Server)。客户端程序可以在需要的时候启动,而服务器为了能够时刻相应连接,则需要一直启动。

例如以打电话为例,首先拨号的人类似于客户端,接听电话的人必须保持电话畅通类似于服务器。连接一旦建立以后,就客户端和服务器端就可以进行数据传递了,而且两者的身份是等价的。在一些程序中,程序既有客户端功能也有服务器端功能,最常见的软件就是QQ、微信这类软件了。

2.网络协议是什么

在计算机网络要做到井井有条的交换数据,就必须遵守一些事先约定好的规则,比如交换数据的格式、是否需要发送一个应答信息。这些规则被称为网络协议。

3.为什么要对网络协议分层

  • 简化问题难度和复杂度。由于各层之间独立,我们可以分割大问题为小问题。

  • 灵活性好。当其中一层的技术变化时,只要层间接口关系保持不变,其他层不受影响。

  • 易于实现和维护。

  • 促进标准化工作。分开后,每层功能可以相对简单地被描述

4.计算机网络体系结构(OSI七层模型)

5.什么是TCP/IP和UDP

TCP/IP即传输控制/网络协议,是面向连接的协议,发送数据前要先建立连接(发送方和接收方的成对的两个之间必须建 立连接),TCP提供可靠的服务,也就是说,通过TCP连接传输的数据不会丢失,没有重复,并且按顺序到达。

UDP它是属于TCP/IP协议族中的一种。是无连接的协议,发送数据前不需要建立连接,是没有可靠性的协议。因为不需要建立连接所以可以在在网络上以任何可能的路径传输,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。

6.TCP与UDP区别:

  • TCP是面向连接的协议,发送数据前要先建立连接,TCP提供可靠的服务,也就是说,通过TCP连接传输的数据不会丢失,没有重复,并且按顺序到达;

  • UDP是无连接的协议,发送数据前不需要建立连接,是没有可靠性;

  • TCP通信类似于于要打个电话,接通了,确认身份后,才开始进行通行;

  • UDP通信类似于学校广播,靠着广播播报直接进行通信。

  • TCP只支持点对点通信,UDP支持一对一、一对多、多对一、多对多;

  • TCP是面向字节流的,UDP是面向报文的; 面向字节流是指发送数据时以字节为单位,一个数据包可以拆分成若干组进行发送,而UDP一个报文只能一次发完。

  • TCP首部开销(20字节)比UDP首部开销(8字节)要大

  • UDP 的主机不需要维持复杂的连接状态表

7. TCP和UDP的应用场景:

对某些实时性要求比较高的情况使用UDP,比如游戏,媒体通信,实时直播,即使出现传输错误也可以容忍;

其它大部分情况下,HTTP都是用TCP,因为要求传输的内容可靠,不出现丢失的情况

8. 形容一下TCP和UDP

TCP通信可看作打电话:

李三(拨了个号码):喂,是王五吗? 王五:哎,您谁啊? 李三:我是李三,我想给你说点事儿,你现在方便吗? 王五:哦,我现在方便,你说吧。 甲:那我说了啊? 乙:你说吧。 (连接建立了,接下来就是说正事了…)

UDP通信可看为学校里的广播:

播音室:喂喂喂!全体操场集合

9.从输入址到获得页面的过程?

  1. 浏览器的地址栏输入URL并按下回车。

  1. 浏览器查找当前URL是否存在缓存,并比较缓存是否过期。

  1. DNS解析URL对应的IP。

  1. 根据IP建立TCP连接(三次握手)。

  1. HTTP发起请求。

  1. 服务器处理请求,浏览器接收HTTP响应。

  1. 渲染页面,构建DOM树。

  1. 关闭TCP连接(四次挥手)。

10. TCP的三次握手

1. 什么是TCP的三次握手

在网络数据传输中,传输层协议TCP是要建立连接的可靠传输,TCP建立连接的过程,我们称为三次握手

  • 第一次握手: 建立连接时,客户端发送syn包(seq=x)到服务器,并进入SYN_SENT状态,等待服务器确认;

  • 第二次握手: 服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;

  • 第三次握手: 客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

完成三次握手,客户端与服务器开始传送数据。

简单来说就是 :

1. 客户端向服务端发送SYN

2. 服务端返回SYN,ACK

3. 客户端发送ACK

想象一个场景,亲戚要来你家串门,亲戚就是客户端,你家就是服务端,

亲戚给你打电话问,你在家么? 第一次握手

你说,在家。 第二次握手

亲戚说,我要去你家找你借钱。。。。。 第三次握手

2. 建立连接可以两次握手吗?为什么?

不可以。

因为可能会出现已失效的连接请求报文段又传到了服务器端。 client 发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但 server 收到此失效的连接请求报文段后,就误认为是 client 再次发出的一个新的连接请求。于是就向 client 发出确认报文段,同意建立连接。假设不采用 “三次握手”,那么只要 server 发出确认,新的连接就建立了。由于现在 client 并没有发出建立连接的请求,因此不会理睬 server 的确认,也不会向 server 发送数据。但 server 却以为新的运输连接已经建立,并一直等待 client 发来数据。这样,server 的很多资源就白白浪费掉了。采用 “三次握手” 的办法可以防止上述现象发生。例如刚才那种情况,client 不会向 server 的确认发出确认。server 由于收不到确认,就知道 client 并没有要求建立连接。而且,两次握手无法保证Client正确接收第二次握手的报文(Server无法确认Client是否收到),也无法保证Client和Server之间成功互换初始序列号。

简单的说,两次握手的话有这么一种情况,亲戚A打算给你还钱,给你打电话问你在家吗?但是卡了,你没收到(你内心是想说我在家,哪怕不在家我也要赶紧赶回去啊);过一会亲戚B打算借你钱,又来打电话问你在家么?你还认为是亲戚A来给你还钱的,于是你说在家在家,结果亲戚B来了,又借走你1w块钱不打算还了,欲哭无泪啊

3. 可以采用四次握手吗?为什么?

这个肯定可以。三次握手都可以保证连接成功了,何况是四次,但是会降低传输的效率。

无非就是你再说一句:好的。没啥用,亲戚该来还是来。

4.第三次握手中,如果客户端的ACK未送达服务器,会怎样?

Server端:由于Server没有收到ACK确认,因此会每隔 3秒 重发之前的SYN+ACK(默认重发五次,之后自动关闭连接进入CLOSED状态),Client收到后会重新传ACK给Server。

Client端,会出现两种情况:

1. 在Server进行超时重发的过程中,如果Client向服务器发送数据,数据头部的ACK是为1的,所以服务器收到数据之后会读取 ACK number,进入 establish 状态

2. 在Server进入CLOSED状态之后,如果Client向服务器发送数据,服务器会以RST包应答。

5. 如果已经建立了连接,但客户端出现了故障怎么办?

服务器每收到一次客户端的请求后都会重新复位一个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

6.初始序列号是什么?

TCP连接的一方A,随机选择一个32位的序列号(Sequence Number)作为发送数据的初始序列号(Initial Sequence Number,ISN),比如为1000,以该序列号为原点,对要传送的数据进行编号:1001、1002...三次握手时,把这个初始序列号传送给另一方B,以便在传输数据时,B可以确认什么样的数据编号是合法的;同时在进行数据传输时,A还可以确认B收到的每一个字节,如果A收到了B的确认编号(acknowledge number)是2001,就说明编号为1001-2000的数据已经被B成功接受。

11.四次挥手

1.什么是四次挥手

1. 第一次挥手:Client将FIN置为1,发送一个序列号seq给Server;进入FIN_WAIT_1状态;

2. 第二次挥手:Server收到FIN之后,发送一个ACK=1,acknowledge number=收到的序列号+1;

进入CLOSE_WAIT状态。此时客户端已经没有要发送的数据了,但仍可以接受服务器发来的数据。

3. 第三次挥手:Server将FIN置1,发送一个序列号给Client;进入LAST_ACK状态;

4. 第四次挥手:Client收到服务器的FIN后,进入TIME_WAIT状态;接着将ACK置1,发送一个

acknowledge number=序列号+1给服务器;服务器收到后,确认acknowledge number后,变为

CLOSED状态,不再向客户端发送数据。客户端等待2*MSL(报文段最长寿命)时间后,也进入

CLOSED状态。完成四次挥手。

2.用现实理解三次握手的具体细节TCP的四次挥手

亲戚来你家借钱了,亲戚说给我钱,我要走了。第一次挥手

你说好的,我去拿钱。 第二次挥手

你把钱交给了亲戚,说拿钱走吧 第三次挥手

亲戚说,我走了哈,拜拜 第四次挥手

你内心(mmp,赶紧的走吧)

3.为什么不能把服务器发送的ACK和FIN合并起来,变成三次挥手?

因为服务器收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复ACK,表示接

收到了断开连接的请求。等到数据发完之后再发FIN,断开服务器到客户端的数据传送。

因为我只是答应了借你钱,还没去拿钱给你呢

4.如果第二次挥手时服务器的ACK没有送达客户端,会怎样?

客户端没有收到ACK确认,会重新发送FIN请求。

亲戚借钱,你假装没听见,不说话,亲戚肯定再问你一遍啊

5.客户端TIME_WAIT状态的意义是什么?

第四次挥手时,客户端发送给服务器的ACK有可能丢失,TIME_WAIT状态就是用来重发可能丢失的

ACK报文。如果Server没有收到ACK,就会重发FIN,如果Client在2*MSL的时间内收到了FIN,就

会重新发送ACK并再次等待2MSL,防止Server没有收到ACK而不断重发FIN。 MSL(Maximum

Segment Lifetime),指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的

最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则

结束TCP连接。

你把钱给了亲戚,亲戚没说要走,你心里发毛不?是不是还会问问,钱都给你了,咋还不走?

12. 什么是Socket

网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。

但是,Socket所支持的协议种类也不光TCP/IP、UDP,因此两者之间是没有必然联系的。在Java环

境下,Socket编程主要是指基于TCP/IP协议的网络编程。

socket连接就是所谓的长连接,客户端和服务器需要互相连接,理论上客户端和服务器端一旦建立

起连接将不会主动断掉的,但是有时候网络波动还是有可能的

Socket偏向于底层。一般很少直接使用Socket来编程,框架底层使用Socket比较多,

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket

其实就是一个外观模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简

单的接口就是全部,让Socket去组织数据,以符合指定的协议。

13. Socket通讯的过程

基于TCP:服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。

基于UDP:UDP 协议是用户数据报协议的简称,也用于网络数据的传输。虽然 UDP 协议是一种不太可靠的协议,但有时在需要较快地接收数据并且可以忍受较小错误的情况下,UDP 就会表现出更大的优势。我客户端只需要发送,服务端能不能接收的到我不管

14.什么是Http协议?

Http协议是对客户端和服务器端之间数据之间实现可靠性的传输文字、图片、音频、视频等超文本数据的规范,格式简称为“超文本传输协议”

Http协议属于应用层,及用户访问的第一层就是http

15.http和https的区别?

其实HTTPS就是从HTTP加上加密处理(一般是SSL安全通信线路)+认证+完整性保护区别:

1. http需要拿到ca证书,需要钱的

2. 端口不一样,http是80,https443

3. http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

4. http和https使用的是完全不同的连接方式(http的连接很简单,是无状态的;HTTPS 协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。)

16.HTTPS工作原理

一、首先HTTP请求服务端生成证书,客户端对证书的有效期、合法性、域名是否与请求的域名一致、证书的公钥(RSA加密)等进行校验;

二、客户端如果校验通过后,就根据证书的公钥的有效, 生成随机数,随机数使用公钥进行加密(RSA加密);

三、消息体产生的后,对它的摘要进行MD5(或者SHA1)算法加密,此时就得到了RSA签名;

四、发送给服务端,此时只有服务端(RSA私钥)能解密。

五、解密得到的随机数,再用AES加密,作为密钥(此时的密钥只有客户端和服务端知道)。

17.http的8中请求方式

1、OPTION: 返回给服务器针对特定资源所支持的请求方式,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性。

2、HEADER:是需要向服务器索要与GET一样的请求,但是不返回返回体,这个方法可以在不必传输整个响应内容的情况下,获取包含在响应消息头中的元信息。

3、GET :向指定资源请求数据,一般用来获取,查询资源信息,较不安全,幂等(幂等是对同一URL的多个请求应该返回同样的结果)的,只用来获取数据不会修改数据,其请求显示在url上,会被缓存,对请求长度有限制。和post是常用的提交方式。

4、POST: 向指定资源提交数据进行请求处理,一般用来更新资源信息,非幂等,请求显示在请求体里面,不会被缓存,对请求长度无限制。

5、PUT: 向指定资源上传最新的内容

6、DELETE: 请求服务器器删除Request-URI所标识的资源。

7、TRANCE: 回显服务器收到的请求,主要用于测试或诊断。

8、CONNECT: HTTP1.1预留给可以将连接改为管道方式的服务器

18.什么是对称加密与非对称加密

对称密钥加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发给对方;(DES、3DES、IDEA、RC5、RC6等)

而非对称加密是指使用一对非对称密钥,即公钥和私钥,公钥可以随意发布,但私钥只有自己知道。发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密。 由于非对称加密的方式不需要发送用来解密的私钥,所以可以保证安全性;但是和对称加密比起来,非常的慢(RSA算法,既能加密,又能实现签名)

19.cookie和session对于HTTP有什么用?

HTTP协议本身是无法判断用户身份。所以需要cookie或者session

什么是cookie

cookie是由Web服务器保存在用户浏览器上的文件(key-value格式),可以包含用户相关的信息。客户端向服务器发起请求,就提取浏览器中的用户信息由http发送给服务器

什么是session

session 是浏览器和服务器会话过程中,服务器会分配的一块储存空间给session。

服务器默认为客户浏览器的cookie中设置 sessionid,这个sessionid就和cookie对应,浏览器在向服务器请求过程中传输的cookie 包含 sessionid ,服务器根据传输cookie 中的 sessionid 获取出会话中存储的信息,然后确定会话的身份信息。

cookie与session区别

1. cookie数据存放在客户端上,安全性较差,session数据放在服务器上,安全性相对更高

2. 单个cookie保存的数据不能超过4K,session无此限制 信息后,使用自己的私钥进行解密。 由于非对称加密的方式不需要发送用来解密的私钥,所以可以保证安全性;但是和对称加密比起来,非常的慢

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

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

相关文章

RPC框架笔记

文章目录RPC概述一次RPC的完整过程RPC的优缺点分层设计编解码层——数据格式协议层——概念网络通信层——网络库RPC框架的关键指标稳定性易用性扩展性观测性高性能Kitex框架解读整体框架自研网络库——Netpoll扩展性设计性能优化——网络库优化性能优化——编解码优化合并部署…

【Flutter入门到进阶】Flutter基础篇---组件生命周期与状态

1 Android界面渲染流程UI树与FlutterUI树的设计思路对比 1.1 android渲染流程中的树的组织 1.1.1 XML加载与解析 1.1.2 ViewRootImpl组织树结构 1.1.3 编舞者掌控调用时机 1.1.4 View负责UI渲染 1.1.5 底层surfacefiling负责沟通硬件 1.2 flutter组件设计思路&#xff0c…

Canal实时监控案例

Canal实时监控案例 文章目录Canal实时监控案例0. 写在前面1. TCP 模式测试1.1 IDEA创建项目canal-module1.2 通用监视类——CanalClient1.2.1 Canal 封装的数据结构1.2.2 在 canal-module 模块下创建 cn.canal 包,并在该包下创建 CanalClient.java文件2. Kafka 模式…

前后端身份验证

1、web 开发模式 【】基于服务端渲染的传统 Web 开发模式 【】基于前后端分离的新型 Web 开发模式:依赖于 Ajax 技术的广泛应用。后端只负责提供 API 接口,前端使用 Ajax 调用接口的开发模式 2、身份认证 【】服务端渲染推荐使用 Session 认证机制 【】…

《堆的应用》TOP-K问题

TOP-K问题:即求数据中前k个最大的元素或者最小的元素,一般情况下,这些数据量是非常大的。 比如:专业前10名、世界500强、世界富豪榜、游戏中前100名等这些排名都是TOP-K问题。 来源于《财富》世界500强排行榜。 对于TOP-k问题,能想到的最简…

【XXL-JOB】XXL-JOB定时处理视频转码

【XXL-JOB】XXL-JOB定时处理视频转码 文章目录【XXL-JOB】XXL-JOB定时处理视频转码1. 准备工作1.1 高级配置1.2 分片广播2. 需求分析2.1 作业分片方案2.2 保证任务不重复执行2.2.1 保证幂等性3. 视频处理业务流程3.1 添加待处理任务3.2 查询待处理任务3.3 更新任务状态3.4 工具…

考研还是工作?两战失败老道有话说

老道入职第一周自我介绍谈谈考研谈谈工作新的启程自我介绍 大家好!在下是一枚考研失败两次的自认为聪明能干的有点小帅的实则超级垃圾的三非名校毕业的自动化渣男。大一下就加入实验室,在实验室焊板子、画板子、培训、打比赛外加摸鱼;参加过…

Swagger扩展 - 同一个接口生成多份Swagger API文档

为同一个ApiOperation生成多份不同Swagger API文档。 0. 目录1. 背景2. 效果展示3. 实现3.1 关键逻辑 - 让接口自解释3.2 关键逻辑 - 如何生成相应的ApiDescription3.3 关键逻辑 - 如何为生成的ApiDescription 赋值3.4 关键逻辑 - 如何动态生成Docket4. 继续优化5. 参考1. 背景…

【Spark分布式内存计算框架——Structured Streaming】3. Structured Streaming —— 入门案例:WordCount

1.3 入门案例:WordCount 入门案例与SparkStreaming的入门案例基本一致:实时从TCP Socket读取数据(采用nc)实时进行词频统计WordCount,并将结果输出到控制台Console。 文档:http://spark.apache.org/docs/2…

一个Bug让人类科技倒退几十年?

大家好,我是良许。 前几天在直播的时候,问了直播间的小伙伴有没人知道「千年虫」这种神奇的「生物」的,居然没有一人能够答得上来的。 所以,今天就跟大家科普一下这个人类历史上最大的 Bug 。 1. 全世界的恐慌 一个Bug会让人类…

Java中的自动类型提升与强制类型转换

一、自动类型提升 自动类型提升是指在程序运行时因为某种情况需要,JVM将较小的数据类型自动转换为较大的数据类型,以保证精度和正确性。在Java中,需要进行类型提升的情况有以下几种: 1. byte、short和char提升为int类型 当运算…

spark sql(五)sparksql支持查询哪些数据源,查询hive与查询mysql的区别

1、数据源介绍 sparksql默认查询的数据源是hive数据库,除此之外,它还支持其它类型的数据源查询,具体的到源码中看一下: 可以看到sparksql支持查询的数据源有CSV、parquet、json、orc、txt、jdbc。这些数据源中前面五个我还能理解&…

【Python】RPA批量生成word文件/重命名及批量删除

批量生成word文件 场景:需要新建多个类似文件名 比如:今天的事例是新建12个文件名为: ​ 保安员考试试卷1及答案.docx ​ 保安员考试试卷2及答案.docx ​ … ​ 保安员考试试卷12及答案.docx 痛点: ​ 手动操作重复性高&a…

目标检测中回归损失函数(L1Loss,L2Loss,Smooth L1Loss,IOU,GIOU,DIOU,CIOU,EIOU,αIOU ,SIOU)

文章目录L-norm Loss 系列L1 LossL2 LossSmooth L1 LossIOU系列IOU (2016)GIOU (2019)DIOU (2020)CIOU (2020)EIOU (2022)αIOU (2021)SIOU (2022…

【SpringCloud】SpringCloud详解之Eureka实战

目录前言SpringCloud Eureka 注册中心一.服务提供者和服务消费者二.需求三.搭建Eureka-Server四.搭建Eureka-Client(在服务提供者配置:用户订单)前言 微服务中多个服务,想要调用,怎么找到对应的服务呢? 这里有组件的讲解 → SpringCloud组件…

深圳大学《计算机论题》作业:大数据与人工智能技术对人类生活的影响

说明 本作业为小组作业,要求基于一场报告完成(即观后感)。共分4个小题,讨论人工智能时代的伦理思考。由于版权原因,不提供报告的具体内容,只展示答题内容。 第一题 (1) 你如何看待…

winform控件PropertyGrid的应用(使运行中的程序能像vistual studio那样设置控件属性)

上周在看别人写的上位机demo代码时,发现创建的项目模板是"Windows 窗体控件库"(如下图) 生成的项目结构像自定义控件库,没有程序入口方法Main,但却很神奇能调试,最后发现原来Vistual Studio启动了一个外挂程序UserContr…

LSM(日志结构合并树)_笔记

WAL:Write Ahead Log 写前日志,顺序日志文件 1 LSM tree的定义 LSM tree: Log-Structured-Merge-Tree,日志结构合并树。 Log-Structured Merge-tree (LSM-tree) is a disk-based data structure designed to provide low-cost …

Linux操作系统学习(了解文件系统动静态库)

文章目录浅谈文件系统了解EXT系列文件系统目录与inode的关系软硬链接动静态库浅谈文件系统 当我们创建一个文件时由两部分组成:文件内容文件属性,即使是空文件也有文件属性 一个文件没有被打开是存储在磁盘中的,而磁盘是计算机中的一个机械…

你想赚的钱不一定属于你

昨天一个同行跟我说,最近有个五十多万的订单,客户是拿着别人家的设计来找的他,跟了也有大半个月了,自己明明报的价格比原设计的公司要低,客户一直说会尽快下的,他原本想着能够从这个订单里赚到几万块&#…