1、什么是C/S架构?

客户端/服务器架构。实现服务端软件与客户端软件基于网络的通信。

2、互联网协议是什么?分别介绍五层协议中每一层的功能?

互联网协议是指用于互联网通信的规范。分为:osi七层、tcp/ip五层、tcp/ip四层

物理层:基于电气特性发送高低电压,高电压用1,低电压用0

数据链路层:通过Ethernet协议标准将电信号进行分组

网络层:引入一套新的地址用来区分不同的广播域/子网,这套地址即网络地址

传输层:建立端口到端口的通信,使用TCP/UDP协议

应用层:发起请求,使用http/ftp/自定义协议

3、基于tcp协议通信,为何建立链接需要三次握手,而断开链接却需要四次挥手

三次握手:首先客户端给服务端发送一个syn包请求连接;服务端收到之后会对客户端的请求作出回应,发送一个ack包给客户端,并且同时将一个syn包发送给客户端请求连接,即发送syn包+ack包;客户端收到syn包+ack包之后,对服务端的请求作出确认,发送一个ack包给服务端,此时,完成三次握手,客户端和服务端开始收发数据。

断开连接的时候,TCP也需要互相确认才可以断开连接,采用四次挥手断开一个连接,客户端如果发送完数据,就给服务端发送一个断开连接的请求,服务端收到请求后,给客户端发送一个确认信息,服务端接收完数据之后给客户端发送断开连接的请求,客户端收到消息后给服务端发送一个确认消息,至此,连接断开。

这样做的原因是,两端数据的接收并不是同时进行的,数据大小也不一样,如果三次挥手有可能导致一端的数据接收不完整。

4、为何基于tcp协议的通信比基于udp协议的通信更可靠?

tcp协议是面向链接的协议,在通信过程中,双方通过三次握手建立连接、四次挥手断开连接,发送方给接收方发送数据,如果没有得到接收方的回应,就会继续给它发消息,直到接收方回应。

udp是面向数据报的协议,不需要三次握手建立连接,它不会管接收方有没有收到数据。

5、流式协议指的是什么协议,数据报协议指的是什么协议?

流式协议指TCP协议,是通过三次握手建立连接再发送数据的,会存在粘包现象,当发送空消息时,对方并不会收到,不一定是一个send就要对应一个recv,传输效率低,网络开销大,可靠性高。

数据报协议是指UDP协议,是以消息为单位发送的数据的,一个sendto就对应一个recvfrom,不会存在粘包现象,即使发送空消息也能收到,传输效率高,网络开销小,可靠性低。

6、什么是socket?简述基于tcp协议的套接字通信流程

socket是介于应用层和传输层之间的一组接口。将复杂的TCP/IP协议封装到接口里面,使用者只需要知道怎么用即可,不需要关心底层的实现。

基于TCP的套接字通信流程:

1)服务端:创建一个套接字对象;绑定本机地址信息;开始时监听;接收连接;

2)客户端:创建套接字对象;主动连接客户端;等待对方接收

通过三次握手后建立连接,开始收发消息。

收发消息完了之后,通过四次挥手断开连接。

7、什么是粘包? socket 中造成粘包的原因是什么? 哪些情况会发生粘包现象?

粘包是指两次命令执行的结果黏在一起。粘包发生在TCP协议中。

造成粘包的原因:接收方不知道所要接收消息的大小和界限。

发生粘包的情况:1、socket缓冲区导致,socket为了提高传输效率,往往会将较短时间间隔内较小的数据包合并发送,这样接收方就会收到一个粘包数据;

        2、接收方不知道该接收多大数据量,当接收方的最大接收量小于消息大小时,会发生粘包。

8、基于socket开发一个聊天程序,实现两端互相发送和接收消息

# 服务端
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR, 1)
server.bind(("127.0.0.1", 8080))
server.listen(5)
print("starting.....")
while True:
    conn, client_addr = server.accept()
    if not conn:
        break
    while True:
        msg = conn.recv(1024)
        print("from aa:", msg.decode())
        if msg.decode() == "bye":
            break
        inp = input("me:").strip()
        conn.send(inp.encode())
    conn.close()
server.close()


# 客户端
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
client.connect(("127.0.0.1", 8080))
while True:
    msg = input("me:").strip()
    client.send(msg.encode())
    if msg == "bye":
        break
    msg1 = client.recv(1024)
    print("from xx:", msg1.decode())
    
client.close()
View Code

相关文章:

  • 2021-08-16
  • 2021-11-22
  • 2021-04-23
  • 2021-10-18
  • 2021-10-31
  • 2021-12-12
  • 2021-12-23
  • 2022-01-16
猜你喜欢
  • 2021-12-14
  • 2022-12-23
  • 2021-10-21
  • 2022-12-23
  • 2021-11-04
  • 2021-10-25
  • 2021-11-03
相关资源
相似解决方案