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

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。

  • 10
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
当谈到C++面试中的网络编程,以下是一些常见的问和答案: 1. 什么是套接字(Socket)? 套接字是一种用于网络通信的编程接口,它提供了一种机制,使得不同主机上的进程可以通过互联网进行通信。 2. TCP和UDP的区别是什么? TCP(传输控制协议)是一种面向连接的协议,它提供可靠的数据传输和流控制。UDP(用户数据报协议)是一种无连接的协议,它提供了一种简单的、无保证的数据传输方式。 3. 如何在C++中创建一个TCP套接字? 在C++中,可以使用socket()函数创建一个TCP套接字。例如: ``` #include <sys/socket.h> int sockfd = socket(AF_INET, SOCK_STREAM, 0); ``` 4. 如何在C++中创建一个UDP套接字? 在C++中,可以使用socket()函数创建一个UDP套接字。例如: ``` #include <sys/socket.h> int sockfd = socket(AF_INET, SOCK_DGRAM, 0); ``` 5. 如何将套接字绑定到特定的IP地址和端口? 可以使用bind()函数将套接字绑定到特定的IP地址和端口。例如: ``` #include <sys/socket.h> #include <netinet/in.h> struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_addr.s_addr = INADDR_ANY; addr.sin_port = htons(1234); bind(sockfd, (struct sockaddr*)&addr, sizeof(addr)); ``` 6. 如何在C++中使用套接字进行TCP客户端编程? 可以使用connect()函数连接到服务器,并使用send()和recv()函数发送和接收数据。例如: ``` #include <sys/socket.h> #include <netinet/in.h> int sockfd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(1234); serverAddr.sin_addr.s_addr = inet_addr("服务器IP地址"); connect(sockfd, (struct sockaddr*)&serverAddr, sizeof(serverAddr)); ``` 这些是一些常见的C++网络编程面试。在面试前,建议你深入了解这些概念,并准备好相关的代码示例和解释。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凛_Lin~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值