1、什么是C/S架构
Client客户端 软件 Server服务端软件
一个C/S架构就是,实现服务端软件与客户端软件基于网络通信。
互联网中处处是C/S架构:
Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
栗子:
如12306网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种)
腾讯作为服务端为你提供视频播放,你下载腾讯视频客户端观看
C/S架构与socket的关系:
我们学习socket就是为了完成C/S架构的开发
2、互联网协议是什么?分别介绍 五层协议中的每一层的功能?
互联网协议:世界上所有计算机之间通信的标准协议,就像英语是世界上通用的语言一样
简单的说,计算机之间的通信标准就是互联网协议
按功能不同,人们将互联网协议分为osi七层、tcp/ip五层、tcp/ip四层
osi七层:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
tcp/ip五层:应用层、传输层、网络层、数据链路层、物理层
tcp/ip四层:应用层、传输层、网络层、网络接口层
五层:
应用层: 软件如:qq,浏览器
传输层: 建立端口到端口的通信 0-65535 0-1023为系统占用端口 两种协议:tcp ucp
网络层: 引入一套新的地址来区分不同的广播域/子网,这套地址即网络地址(ip协议)
数据链路层: 定义了电信号的分组方式 以太网协议(ethernet) mac地址指网卡地址 广播
物理层: 主要是基于电器特性发送高低电压(电信号),高电压对应数字1,低电压对应数字0
3、基于TCP协议通信,为何建立连接需要三次握手,而断开连接却需要四次挥手
建立连接 三次握手:client发送请求建立通道;server收到请求并同意,同时也发送请求建通道;client收到请求并同意,建立完成
断开连接 四次挥手:client发送请求断开通道;server收到请求并同意,同时还回复client上一条消息;server也发送请求断开通道;client受到消息结束
4、为何基于TCP协议的通信比基于UDP协议的通信更可靠
TCP:可靠,对方给了确认收到信息,才发下一个,如果没有收到确认信息就重发
UDP:不可靠一直发数据,不需要对方回应
5、流式协议指什么协议,数据报协议指的是什么协议?
流式协议:TCP协议,可靠传输
数据报协议:UDP协议,不可靠传输
也就是TCP和UDP的区别:
TCP是面向连接的,可靠的字节流服务
UDP是面向无连接的数据报服务
6、什么是socket?简述基于tcp协议的套接字通信流程
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/ip
协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部。
7、什么是粘包?socket中造成粘包的原因是什么?那些情况会发生粘包现象?
粘包:
数据粘在一起
主要因为:接收方不知道消息之间的界限,不知道一次性提取
多少字节的数据造成的数据量比较小,时间间隔比较短,就合并成了一个包,这是底层的一个优化算法(Nagle算法)
from socket import * phone = socket(AF_INET,SOCK_STREAM) phone.setsockopt(SOL_SOCKET,SOCK_STREAM,1) phone.bind(('127.0.0.1',8080)) phone.listen(5) print('start running...') coon,addr = phone.accept() #等待连接 data1 = coon.recv(10) data2 = coon.recv(10) print('------------>',data1.decode('utf-8')) print('------------>',data2.decode('utf-8')) coon.close() phone.close()
客户端:
from socket import * import time phone = socket(AF_INET,SOCK_STREAM) phone.connect(('127.0.0.1',8080)) phone.send('hello'.encode('utf-8')) phone.send('helloworld'.encode('utf-8')) phone.close()
服务端:
from socket import * phone = socket(AF_INET,SOCK_STREAM) phone.setsockopt(SOL_SOCKET,SOCK_STREAM,1) phone.bind(('127.0.0.1',8080)) phone.listen(5) print('start running...') coon,addr = phone.accept() #等待连接 data1 = coon.recv(2) #一次没有接收完整 data2 = coon.recv(10) #下一次接收的时候会先取旧的数据,然后取新的 # data3 = coon.recv(1024) #接收等5秒后的信息 print('------------>',data1.decode('utf-8')) print('------------>',data2.decode('utf-8')) # print('------------>',data3.decode('utf-8')) coon.close() phone.close()
客户端:
from socket import * import time phone = socket(AF_INET,SOCK_STREAM) phone.connect(('127.0.0.1',8080)) phone.send('hello'.encode('utf-8')) time.sleep(5) phone.send('haiyan'.encode('utf-8')) phone.close()
8、基于Socket开发一个聊天程序,实现两端互相发送和接收消息
8.1、tcp协议实现
TCP协议: 服务端: import socket server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) ip_port = ('127.0.0.1',8081) MAX_RECV_SIZE = 1024 server_socket.bind(ip_port) server_socket.listen(5) while True : conn, client_addr = server_socket.accept() while True: data = conn.recv(MAX_RECV_SIZE).decode('utf-8') print(data) msg = input('(q 退出)>>').strip() if not msg:break if msg == 'q': exit() conn.send(msg.encode('utf-8')) 客户端: import socket client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) ip_port = ('127.0.0.1',8081) MAX_RECV_SIZE = 1024 client_socket.connect(ip_port) while True: msg = input('(q 退出)>>').strip() if not msg:continue if msg == 'q': exit() client_socket.send(msg.encode('utf-8')) data = client_socket.recv(MAX_RECV_SIZE) print(data.decode('utf-8'))