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

TCP与UDP区别

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

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

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

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

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

  1. 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。

相关推荐
长弓三石2 小时前
鸿蒙网络编程系列44-仓颉版HttpRequest上传文件示例
前端·网络·华为·harmonyos·鸿蒙
xianwu5432 小时前
反向代理模块
linux·开发语言·网络·git
follycat2 小时前
[极客大挑战 2019]HTTP 1
网络·网络协议·http·网络安全
xiaoxiongip6663 小时前
HTTP 和 HTTPS
网络·爬虫·网络协议·tcp/ip·http·https·ip
JaneJiazhao3 小时前
HTTPSOK:智能SSL证书管理的新选择
网络·网络协议·ssl
CXDNW3 小时前
【网络面试篇】HTTP(2)(笔记)——http、https、http1.1、http2.0
网络·笔记·http·面试·https·http2.0
无所谓จุ๊บ4 小时前
树莓派开发相关知识十 -小试服务器
服务器·网络·树莓派
道法自然04024 小时前
Ethernet 系列(8)-- 基础学习::ARP
网络·学习·智能路由器
EasyCVR5 小时前
萤石设备视频接入平台EasyCVR多品牌摄像机视频平台海康ehome平台(ISUP)接入EasyCVR不在线如何排查?
运维·服务器·网络·人工智能·ffmpeg·音视频
明月看潮生6 小时前
青少年编程与数学 02-003 Go语言网络编程 15课题、Go语言URL编程
开发语言·网络·青少年编程·golang·编程与数学