并发网络编程学习笔记(1)

/ 0评 / 0

1. 网络编程

  1. 网络基础
    • 网络功能:实现资源共享,信息快速传递
    • 网络通信标准
    • OSI 7层模型7应用层各层应用程序6表示层数据格式化、加解密、数据压缩与解压缩5会话层建立、管理、终止应用之间的会话连接4传输层提供端到端的数据服务(TCP/UDP)3网络层逻辑寻址、路由选择2数据链路层将分组数据封装成包1物理层在介质上传输比特;提供物理的规
    • 好处
      1. 建立了统一的通信标准
      2. 降低陈发难度,每层功能明确,各司其职
      3. 七层模型实际规定了每一层的任务,该完成什么事情
  2. TCP/IP模型
    • 七层模型过于理想,结构细节复杂
    • 在工程中应用实践难度大
    • 实际工作中以TCP/IP模型为工作标准流程OSI7层TCP/IP协议集Telnet,FTP,SMTP,DNS,HTTP等7应用层应用层6表示层应用层5会话层应用层4传输层传输层TCP、UDP3网络层网络层2数据链路层网络接口层1物理层网络接口层各种通信网络接口
  3. 应用工程师任务:编写应用功能,明确对方地址,选择传输服务
  4. 通信地址:
    • IP地址:即在网络中标识一台计算的地址编号
    • IP地址分类:
      • IPv4:分为4个部分,每个部分都是一个整数,取值从0-2255
      • IPv6:分为8个部分,每部分4个16进制数,如果出现连续0则用::省略中间的0
    • IP地址相关命令
      • Ifconfig 查看linux系统下计算机的IP地址
      • ping查看计算机的连通性
    • 公网IP和内网IP
      • 公网IP指的是连接到互联网的公共ip地址
      • 内网IP指的是局域网各范围内网络设备分配的IP地址
    • 端口号:网络地址的一部分,每个网络程序对应一个端口
      • 取值范围 :0-65535
      • 一台计算上网络所使用的端口不会重复
      • 通常0-1023端口会被一些系统服务占用
  5. 服务端与客户端
    • 服务端(server): 为客户端服务,服务内容如为客户端提供资源,保存客户端数据,处理客户端请求;
    • 客户端(client):也称用户端,为客户提供一定应用功能的程序。

2. UDP传输

3.TCP传输方法

4. TCP与UDP对比

  1. 传输特征
    • TCP提供可靠的数据传输,UDP则不保证数据传输的可靠性
    • TCP传输数据处理为字节流,而UDP处理为数据包形式
    • TCP传输需要建立连接才能进行数据传,效率相对较低,UDP比较自由,无需连接,效率较高
  2. 套接字编程区别
    • 创建的套接字类型不同
    • TCP套接字会有粘包,UDP套接字有消息边界不会粘包
    • TCP套接字依赖listen accept建立连接才能收发消息,UDP套接字则不需要
    • TCP套接字使用send,recv收发消息,UDP套接字使用sendto,recvfrom
  3. 使用场景
    • TCP更适合对准确性要求高,传输数据较大的场景
      • 文件传输:如视频上、下载,网页访问,文件上传
      • 邮件收发
      • 点对点数据传输:聊天,登录,远程访问,红包
    • UDP适合对可靠性要求不太高,传输方式自由的场景
      • 视频流的传输:如直播,视频聊天
      • 广播:网络广播,群发消息
      • 实时传输:如游戏画面

5. 数据传输过程

# 示例代码 服务端
from socket import *
# 创建tcp套接字
tcp_socket = socket(AF_INET,SOCK_STREAM)
​
# 绑定地址
tcp_socket.bind(("0.0.0.0",3333))
​
# 设置为监听套接字
tcp_socket.listen(5)
​
# 等待客户端连接
while True:
  print("Waiting for connect...")
  connfd,addr = tcp_socket.accept()
  print("Connect from ",addr) 
  
​
  # 循环收发消息
  while True:
    data = connfd.recv(1024)
    if data == b"##":
      break
    print("收到:",data.decode())
    connfd.send(b"Thanks")
   connfd.close()
   
# 关闭套接字
tcp_socket.close()

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注