python3 网络编程

Posted on 2019-07-02 19:20  麻世骞  阅读(225)  评论(0编辑  收藏  举报

1、C/S架构

  C/S即:Client与Server ,中文意思:客户端与服务器端架构,这种架构也是从用户层面(也可以是物理层面)来划分的。

  这里的客户端一般泛指客户端应用程序EXE,程序需要先安装后,才能运行在用户的电脑上,对用户的电脑操作系统环境依赖较大。

 

2、B/S架构

  B/S即:Browser与Server,中文意思:浏览器端与服务器端架构,这种架构是从用户层面来划分的。

  Browser浏览器,其实也是一种Client客户端,只是这个客户端不需要大家去安装什么应用程序,只需在浏览器上通过HTTP请求服务器端相关的资源(网页资源),客户端Browser浏览器就能进行增删改查。

 

3、OSI七层模型

     

   

 

  应用层:Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式。

      FTP是文件传输协议(英文:File Transfer Protocol,缩写:FTP)是用于在网络上进行文件传输的一套标准协议。

      SMTP是简单邮件传输协议 (Simple Mail Transfer Protocol, SMTP) 是在Internet传输email的事实标准。

      DNS是域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。

      HTTP是超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。

  传输层:TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。

      UDP 中文名是用户数据报协议,是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。

      TCP和UDP的区别:

      1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接

      2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。

      3、UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。

      4.每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信

      5、TCP对系统资源要求较多,UDP对系统资源要求较少。

  网络层:IP地址是互联网协议地址的缩写,是分配给用户上网使用的网际协议的设备的数字标签。

      ARP是地址解析协议,是根据IP地址获取物理地址的一个TCP/IP协议。

      RARP是反向地址转换协议,他允许局域网的物理机器从网关服务器的ARP表或者缓存上请求其IP地址。

      ICMP,Internet控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。

 

4、socket      

                           

  Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。    

  当我们使用不同的协议进行通信时就得使用不同的接口,还得处理不同协议的各种细节,这就增加了开发的难度,软件也不易于扩展。于是UNIX BSD就发明了socket这种东西,socket屏蔽了各个协议的通信细节,使得程序员无需关注协议本身,直接使用socket提供的接口来进行互联的不同主机间的进程的通信。

 

5、三次握手,四次挥手  

  工作原理图示: 

            

 

           

  注:   ACK :确认号是否有效,一般置为1。

     PSH :提示接收端应用程序立即从TCP缓冲区把数据读走。
     RST :对方要求重新建立连接,复位。
     SYN :请求建立连接,并在其序列号的字段进行序列号的初始值设定。建立连接,设置为1
     FIN   :希望断开连接。

     URG :紧急指针是否有效。为1,表示某一位需要被优先处理

  通俗的讲,三次握手的过程就是请求链接,确认是否能连,确认能连!我们链接吧!四次挥手就是我们断开连接吧,确认是否断开,好!我们断开吧!成功断开。

 

6、黏包

  黏包有两种:

  一种是因为发送数据包时,每次发送的包小,因为系统进行优化算法,就将两次的包放在一起发送,减少了资源的重复占用。多次发送会经历多次网络延迟,一起发送会减少网络延迟的次数。因此在发送小数据时会将两次数据一起发送,而客户端接收时,则会一并接收。#即出现多次send会出现黏包

  第二种是因为接收数据时,又多次接收,第一次接收的数据量小,导致数据还没接收完,就停下了,剩余的数据会缓存在内存中,然后等到下次接收时和下一波数据一起接收。

  黏包的解决方法:  

  1、问题的根源在于,接收端不知道发送端将要传送的字节流的长度,所以解决粘包的方法就是围绕,如何让发送端在发送数据前,把自己将要发送的字节流总大小让接收端知晓,然后接收端来一个死循环接收完所有数据。

  此处使用struct解决黏包 

  

            

  2、使用time模块,在每次send的时候加入一个time.sleep(0.01),这种方法可以有效地隔开两次send,断开系统的优化,此种方法虽然可以解决黏包问题,但是会造成发送数据时间长

  3、先读取文件的大小,然后将文件的大小发送给接收端,这样接收端就可以以文件大小来写入数据。  

  为什么会出现黏包问题?

  首先只有在TCP协议中才会出现黏包现象,是因为TCP协议是面向流的协议,在发送的数据传输的过程中海油缓存机制来避免数据丢失,因为在连续发送小数据的时候、以及接收大小不符的时候都容易出现黏包现象,本质还是因为我们在接收数据的时候不知道发送的数据的长短。