今天在找Python网络编程的题目,发现了一篇不错的网络编程的推文,分享给大家,总共罗列出最常见的12道编程题 。大家可以先看看题目,看看自己是否都能答个大概 。
1.简述 OSI 七层协议。
2. 简述 TCP/IP 四层协议。
3. TCP 和 UDP 的区别是什么?
4. TCP 连接建立的时候 3 次握手的具体过程,以及其中的每一步是为什么?
5. TCP 断开连接的具体过程,其中每一步是为什么那么做?
6. TCP 的十一种状态?
7. 什么是 socket?简述基于 tcp 协议的套接字通信流程。
8. 简述基于 udp 协议的套接字通信流程。
9. TCP 为什么不是两次连接?而是三次握手?
10. 为何基于 tcp 协议的通信比基于 udp 协议的通信更可靠?
11. 网络编程中设计并发服务器,使用多进程与多线程,请问有什么区别?
12. 大规模连接上来,并发模型怎么设计?
1.简述 OSI 七层协议。
▪ 应用层
▪ 表示层
▪ 会话层
▪ 传输层
▪ 网络层
▪ 数据链路层
▪ 物理层
2. 简述 TCP/IP 四层协议。
应用层:HTTP
传输层:TCP
网络层:IP
数据链路层:以太网
3. TCP 和 UDP 的区别是什么?
4. TCP 连接建立的时候 3 次握手的具体过程,以及其中的每一步是为什么?
第一步:发送方发送同步序列标号 SYN seq=x
第二步:接收方发送同步序列标号 SYN seq=y 和 确认包ACK x+1
第三步:发送方发送确认包ACK y+1 连接建立成功
5. TCP 断开连接的具体过程,其中每一步是为什么那么做?
第一步:客户端关闭客户到服务器的数据传送,发送给服务端一个FIN seq=x
第二步:服务器收到这个FIN,发回一个ACK x+1,确认序号为收到的序号加1
第三步:服务器关闭客户端的连接,发送给客户端一个FIN seq=y
第四步:客户端发回ACK y+1报文确认,确认序号设置为收到序号加1
6. TCP 的十一种状态?
三次握手:
CLOSED表示初始状态。
LISTEN表示服务器端的某个SOCKET处于监听状态,可以接受连接。
SYN_SENT表示客户端已发送SYN报文,当客户端SOCKET执行CONNECT连接时进入该状态。
SYN_RCVD表示接收到了SYN报文。
ESTABLISHED表示连接已经建立。
四次挥手:
FIN_WAIT_1表示向对方发送了FIN报文,等待对方的FIN报文。当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即进入到FIN_WAIT_1状态。
FIN_WAIT_2表示向对方发送了FIN报文,并收到对方回应的ACK报文。该SOCKET则进入到FIN_WAIT_2状态。实际上表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接。
TIME_WAIT表示收到了对方的FIN报文,并发送出了ACK报文。等2MSL后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,同时收到了对方带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。
CLOSING,表示双方都正在关闭SOCKET连接,如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报文的情况,也就会出现CLOSING状态。
CLOSE_WAIT表示在等待关闭。当对方close一个SOCKET后发送FIN报文给自己,己方毫无疑问地会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。接下来查看你是否还有数据发送给对方,如果没有,就可以close这个SOCKET,发送FIN报文给对方,也即关闭连接。所以在CLOSE_WAIT状态下,需要完成的事情是等待己方去关闭连接。
LAST_ACK表示被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。
7. 什么是 socket?简述基于 tcp 协议的套接字通信流程。
socket(简称套接字) 是进程间通信的⼀种⽅式, 能实现不同主机间的进程间通信。
流程:
通信双方实例化tcpSocket对象,服务端绑定ip和端口号并执行lisient()方法进入监听状态。
客户端执行connect()方法请求连接,双方完成三次握手建立连接(模块内部实现)。
服务段执行accept()方法获得连接对象,双方实现通信。
通信结束执行close()方法关闭连接。
8. 简述基于 udp 协议的套接字通信流程。
通信双方实例化tcpSocket对象,服务端绑定ip和端口号。
客户端和服务端都可以执行sendto()方法发送数据给指定ip地址和端口号的主机。
客户端和服务端都可以执行recvfrom()方法获得发送给自己的数据以及发送方的ip和端口号。
通信结束执行close()关闭socket对象。
9. TCP 为什么不是两次连接?而是三次握手?
先来分析三次握手:
第一步客户端发送SYN,第二步服务端发送ACK说明客户端发送能力,服务端接收能力OK。
第三部客户端发送ACK说明客户端接受能力,服务端发送能力OK,连接则是可靠的。
如果是两次:
客户端知道自己的接受发送能力和服务端的接受发送能力都OK,而服务端只知道自己的接受能力和客户端的发送能力OK,其余的都不知道,连接不可靠。
10. 为何基于 tcp 协议的通信比基于 udp 协议的通信更可靠?
TCP:面向连接,对方给了确认收到信息,才发下一个,如果没收到确认信息就重发,数据不会丢失
UDP:无连接,一直发数据,不需要对方回应,可能造成数据丢失
11. 网络编程中设计并发服务器,使用多进程与多线程,请问有什么区别?
多进程:
开启多个进程为客户端服务,同一时刻可为多个客户端提供服务,但是任务量大会因为创建进程的开销影响服务器性能。
多线程:
一个进程内开启多个线程,同一时刻只能为一个客户端服务,I/O等待的时间可以进行别的任务,不会浪费时间,不影响服务器性能,推荐使用。
12. 大规模连接上来,并发模型怎么设计?
多进程:
开启多个进程为客户端服务,同一时刻可为多个客户端提供服务,但是任务量大会因为创建进程的开销影响服务器性能。
多线程:
一个进程内开启多个线程,同一时刻只能为一个客户端服务,I/O等待的时间可以进行别的任务,不会浪费时间,不影响服务器性能,推荐使用。
协程:
协程的优势在于函数入口可以是上次停止的地方,显然对大规模连接没什么帮助。
所以这种情况推荐使用多线程来设计并发模式。
版权声明:本文为CSDN博主「Mr. Donkey_K」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
https://blog.csdn.net/Dreaming5498/article/details/97107804
如果对于参考答案有不认同的,大家可以在评论区指出和补充,欢迎留言!
更多题目:
52、read、readline和readlines的区别?
关注小猿公众号,每天学习一道题