C++面试题记录(网络)

server/2024/10/19 18:25:27/

TCP与UDP区别

1. TCP面向连接,UDP无连接,所以UDP数据传输效率更高

2.UDP可以支持一对一、一对多、多对一、多对多通信,TCP只能一对一

3. TCP需要在端系统维护连接状态,包括缓存,序号,确认号,拥塞控制参数等,UDP不维护

4.TCP首部20字节,UDP首部8字节

5.UDP没有拥塞控制,应用层对于数据发送的控制更灵活,某些应用需要稳定速率发送,允许少量丢失,UDP可以稳定发送不受网络拥塞程度影响

6. TCP是可靠交付,UDP不保证可靠传输,但可以在应用层做出自己的可靠性机制

7.TCP传输的是报文段,应用层数据视为字节流,传输时可能分片也可能多报文合并传输,UDP传的是用户数据报,由应用层决定多长,不合不拆

TCP连接建立

服务器进入LISTEN(监听)状态后,客户端可以发送连接请求。这个连接请求报文段SYN同步位设置1,初始序号seq=x,不携带数据但消耗一个序号。 发送后客户端进入SYN-SENT(同步已发送)

服务器如果同意连接,发回确认报文段并分配资源。 确认报文段SYN=1,ACK=1,确认号ack=x+1,同时也选择自己的初始序号seq=y。确认报文也不携带数据,消耗一个序号。 发送确认后服务器进入SYN-RCVD(同步确认)

客户端收到确认后向服务器发出确认,并为连接分配资源。确认报文段ACK=1,seq=x+1,ack=y+1该报文可以携带数据,如果携带数据消耗一个序号,不携带数据不消耗序号。发送确认后客户端进入ESTABLISHED(连接建立)

服务器收到客户端确认后进入ESTABLISHED(连接建立)

(由于服务器接收到连接请求,如果同意就分配资源,那么多个客户机只发连接请求,但不回应服务器确认报文,就会导致服务器资源消耗尽,称为SYN洪泛攻击)

TCP连接释放

客户端发送连接释放报文段,然后停止发送数据。报文段FIN设置为1,序号seq=u,(u是客户端发送最后一个数据字节的序号+1),FIN可携带数据,无论有没有携带都消耗一个序号。发送完报文段后客户端进入FIN-WAIT-1(终止等待1)

服务器发出确认报文段,ACK=1,确认号ack=u+1,序号seq=v,(v是此tcp连接的服务器发送的最后一个数据字节的序号+1)。服务器发送确认后进入CLOSE-WAIT(关闭等待),这个状态下还会继续向客户端发送未完成的数据

客户端接收到服务器的确认报文后,进入FIN-WAIT-2(终止等待2),直到服务器发完想发的数据

如果服务器发送完想发的数据或者根本没有数据要发,就发出连接释放报文段。报文段FIN=1,ACK=1,ack=u+1,seq=w (seq=w是因为服务器发送了未完成的数据)。发送连接释放报文段后服务器进入LAST-ACK(最后确认)

客户机收到连接释放报文段,向服务器发出确认。确认报文段ACK=1,seq=u+1,ack=w+1。发送确认后,进入TIME-WAIT(定时等待) ,开始计时,如果经过2个最长报文段寿命(2MSL),都没有接收到服务器重传的连接释放报文段,客户机就可以安心进入CLOSED(连接关闭)

服务器接收到客户机连接释放的确认报文后进入CLOSED,如果一直没接到连接释放的确认报文,就重发连接释放报文段。

套接字通信(socket)

一般网络通信有两种方式,应用层给传输层TCP传报文段或者给UDP传用户数据报。为了方便使用传输层的两个协议才产生socket通信。套接字其实就是系统提供的网络编程接口,使得我们不用考虑建立连接的细节就能使用网络通信。两个进程通信,各使用一个套接字,套接字含IP地址,端口,通信协议,还可以支持加密,方便我们使用网络。socket套接字支持使用TCP和UDP,还可以不用这两种协议,而是自己控制传输方法。通过套接字可以创建TCP或者UDP连接。

winsock建立连接的主要实现步骤?

    服务器端:socket()建立套接字,绑定(bind)端口并监听(listen)连接,用accept()等待客户端连接, accept()发现有客户端连接,建立一个新的套接字接收。该新产生的套接字使用send()和recv()写读数据,直至数据交换完毕,closesocket()关闭套接字。

    客户端:socket()建立套接字,连接(connect)服务器,连接上后使用send()和recv(),在套接字上写读数据,直至数据交换完毕,closesocket()关闭套接字。

    套接字关闭时有两个函数,close和shutdown,close使引用计数减1,计数为0释放套接字,未发送的数据仍会继续发;shutdown切断连接,但没有释放socket

套接字三种类型

流式socket(tcp传输),数据报式(udp传输),原始socket(可以读写内核没有处理的IP数据包)

TCP为什么不是两次连接?而是三次握手?

如果A与B两个进程通信,如果仅是两次连接。可能出现的一种情况就是:A发送完请报文以后,由于网络情况不好,出现了网络拥塞,即B延时很长时间后收到报文,即此时A将此报文认定为失效的报文。B收到报文后,会向A发起连接。此时两次握手完毕,B会认为已经建立了连接可以通信,B会一直等到A发送的连接请求,而A对失效的报文回复自然不会处理。依次会陷入B忙等的僵局,造成资源的浪费。

FTP的连接模式

FTP是应用层协议,传输层使用TCP。工作时使用两个并行TCP连接,控制连接端口号21,数据练级端口号20.

服务器监听21号端口,等待连接。控制连接用来传控制信息,如连接请求,传送请求等,以7位ASCII码格式传送。

建立控制连接后,如果服务器控制进程接收到客户端文件传送请求,就建立数据传送进程和数据连接,由两个数据传送进程进行数据通信。

建立的数据连接有主动模式和被动模式。主动模式是客户端开放一个端口,发送控制信息给服务器,由服务器20号端口连接客户端开放的端口。被动模式是客户端发控制命令告诉服务器使用被动模式,服务器开放一个随机端口并高斯客户端,客户端再连接到此端口。

(使用被动模式一般是因为客户端防火墙对于开放端口有影响)

HTTP过程

http是应用层协议,本身无连接,在传输层使用tcp连接。

访问www服务器时,首先是DNS域名解析,获取ip地址后浏览器向服务器发tcp连接请求,建立tcp连接后,浏览器向服务器发http请求,服务器返回http响应,浏览器对信息进行解释,显示web页面,最后释放tcp连接。

http可以使用持久连接和非持久连接,持久连接就是在获取服务器响应后不释放tcp连接,可以继续使用此连接向服务器请求数据。

对于持久连接可以分流水线方式请求和非流水线方式请求。流水线方式是没收到响应前可以继续发请求,非流水线方式要求接收到响应才能继续发下一个请求。

Cookie原理

用户浏览某个网站,服务器为用户产生Cookie,包含一些信息,如用户的标识符、会话ID、用户偏好等,通常以“名/值”对(name-value pairs)的形式存储。接着返回的响应报文添加一个Set-cookie字段将cookie一起返回。

用户接收到响应,Cookie文件保存在本地

下次访问时,将之前存储的Cookie发送回服务器。这通常通过HTTP请求头中的Cookie字段完成。

GET和POST

GET方法用于从Web服务器请求数据。在使用GET方法时,浏览器向Web服务器发送一个请求,Web服务器将响应数据发送回浏览器。GET方法是无状态的,也就是说每个请求都是独立的,没有前后关系。GET方法通常用于请求静态数据,如HTML页面、图片和CSS文件等。

POST方法用于向Web服务器提交数据。在使用POST方法时,浏览器将数据打包并发送到Web服务器。Web服务器收到数据后,可以根据数据执行相应的操作,并向浏览器发送响应。POST方法是有状态的,也就是说请求和响应之间存在关系,请求和响应之间的数据可以互相传递。POST方法通常用于向Web服务器提交表单数据和上传文件等操作。

在使用GET方法时,浏览器将请求的参数附加到URL的末尾,以“?”号开始,并用“&”符号将多个参数连接在一起。

在使用POST方法时,浏览器将要请求的数据打包并放置在HTTP请求体中。请求头中会包含请求体的大小等信息。

GET方法将数据附加到URL中,因此数据大小有限制。在URL中,只能传递ASCII字符,并且URL的长度有限制。

POST方法将数据放在HTTP请求体中,因此数据大小不受限制。但是,Web服务器和Web应用程序可能会对POST请求的大小进行限制。

GET方法的参数是通过URL传递的,因此可以很容易地在浏览器地址栏中看到。

POST方法将数据放在HTTP请求体中,因此相对于GET方法更加安全。但是请求体可能被捕获。

GET方法具有缓存机制。如果浏览器请求的资源已经在本地缓存中存在,浏览器将使用缓存而不是向服务器发送请求。这可以提高Web应用程序的性能。

POST方法没有缓存机制。每次使用POST方法发送请求时,浏览器都会向Web服务器发送请求,Web服务器也会重新处理请求。因此,POST方法的性能相对于GET方法较低。

常见的 HTTP 状态码有哪些

1xx        信息,服务器收到请求,需要请求者继续执行操作

2xx        成功,操作被成功接收并处理

3xx        重定向,需要进一步的操作以完成请求

4xx        客户端错误,请求包含语法错误或无法完成请求

5xx        服务器错误,服务器在处理请求的过程中发生了错误

HTTPS HTTP 的区别

     HTTPS 相较 HTTP 不是一种新协议,只是在 HTTP 通信接口部分使用了 SSL和TLS协议来实现。使得 HTTP 先与 SSL 通信,再由 SSL 和 TCP 通信,而不是 HTTP 直接与 TCP 通信。

    1.SSL安全协议

    HTTP 信息是明⽂传输,存在安全⻛险的问题。

    HTTPS 在TCP 和 HTTP ⽹络层之间加⼊了 SSL/TLS 安全协议,使得报⽂能够加密传输。

    2.建立连接

    HTTP 连接建⽴相对简单, TCP 三次握⼿之后便可进⾏ HTTP 的报⽂传输。

    HTTPS 在 TCP 三次握⼿之后,还需进⾏ SSL/TLS 的握⼿过程,才可进⼊加密报⽂传输。

    3.端口号

    HTTP 的端⼝号是 80。

    HTTPS 的端⼝号是 443。

    4.CA证书

    HTTPS 协议需要向 CA(证书权威。机构)申请数字证书来保证服务器的身份是可信的。

https的请求过程?

    用户在浏览器里输入一个https网址,然后连接到server的443端口。

    服务器将自己的数字证书(含有公钥)发送给客户端。

    客户端收到服务器端的数字证书之后,会对其进行检查,如果不通过,则弹出警告框。如果证书没问题,则生成一个密钥(对称加密),用证书的公钥对它加密。

    客户端会发起HTTPS中的第二个HTTP请求,将加密之后的客户端密钥发送给服务器。

    服务器接收到客户端发来的密文之后,会用自己的私钥对其进行非对称解密,解密之后得到客户端密钥,然后用客户端密钥对返回数据进行对称加密,这样数据就变成了密文。

    服务器将加密后的密文返回给客户端。

    客户端收到服务器发返回的密文,用自己的密钥(客户端密钥)对其进行对称解密,得到服务器返回的数据。

对称加密和非对称加密的区别

    对称加密算法:加密和解密使用相同密钥的加密算法。常见的对称加密算法有AES、3DES、DES、RC5、RC6等。

    非对称加密算法:非对称加密算法需要两个密钥(公开密钥和私有密钥)。公钥与私钥是成对存在的,如果用公钥对数据进行加密,只有对应的私钥才能解密。主要的非对称加密算法有:RSA、Elgamal、DSA、D-H、ECC。


http://www.ppmy.cn/server/45072.html

相关文章

【网络协议Http】Http中get,post,put,delete区别

Http协议 超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。 【参考】 GET && POST 对比 关于tcp数据包:对于GET方式的请求,浏览器会把http hea…

扎气球最高分-第13届蓝桥杯选拔赛Python真题精选

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第74讲。 扎气球最高分&…

【MySQL精通之路】SQL语句(7)-数据库管理语句(3)-表维护语句

目录 1.ANALYZE TABLE语句 1.1 输出 1.2 KEY分布分析 1.3 直方图统计分析 2.CHECK TABLE语句 2.1 输出 2.2 检查版本兼容性 2.3 检查数据一致性 2.4 InnoDB表的CHECK TABLE的使用说明 2.5 MyISAM表的CHECK TABLE使用说明 3.CHECKSUM TABLE语句 3.1 性能注意事项 4…

分享一个用AI降本的思路,不懂代码也能上手

如何用AI解决实际的业务问题? 生财圈友我来利用ChatGPT做算法建模,每年为公司省下6万元。 今天他将分享通过ChatGPT进行数据分析的思路,从最开始定义问题到最终数据论证。 上手的实操过程门槛并不高,但可以实现把官方电商平台的…

地质考察AR远程交互展示系统辅助老师日常授课

广东这片充满活力的土地,孕育了一家引领ARVR科技潮流的杰出企业——深圳华锐视点,作为一家专注于VR/AR技术研究与业务开发的先锋公司。多年来,我们不断突破技术壁垒,将AR增强现实技术与各行各业的实际需求完美结合,助力…

认识K8s集群的声明式资源管理方法

前言 Kubernetes 集群的声明式资源管理方法是当今云原生领域中的核心概念之一,使得容器化应用程序的部署和管理变得更加高效和可靠。本文将认识了解 Kubernetes 中声明式管理的相关理念、实际应用以及优势。 目录 一、管理方法介绍 1. 概述 2. 语法格式 2.1 管…

c#点击listview控件获取内容

构造函数添加: 点击事件: (listview控件确保有内容,比如已查询到数据添加到了listview) if (listView_data_base.Items.Count > 0){listView_data_base.FullRowSelect true;listView_data_base.Items[listView_da…

Debug-013-el-loading中显示倒计时时间

前言: 今天实现一个小小的优化,业务上是后端需要从设备上拿数据,所以前端需要不断调用一个查询接口,直到后端数据获取完毕,前后端根据一个ending字段为true判断停止调用查询接口。由于这个查询时间比较久&…