网络编程 基础一

1.软件开发架构:
开发软件,必须要开发一套 客户端 与 服务端。

​ 客户端与服务端的作用:
​ 服务端: 24小时不间断提供服务
​ 客户端: 如果想要找服务,就去寻找服务并享受

软件开发架构分为两种:
    C/S架构:
      	Client:客户端
       	Server:服务端   
    优点:
        软件使用稳定,并且可以节省网络资源。
    缺点:
        1、用户若想在同一个设备上用多个软件,必须下载多个客户端
        2、软件每次更新,客户端也必须更新

    C/S架构的软件:
        电脑QQ、Pycharm、手机端的微信、王者荣耀等

B/S架构:
    Browser:浏览器
    Server:服务端

    优点:
        以浏览器充当客户端,无需下载多个软件,也无需用户下载更新软件版本
        直接在浏览器上访问需要使用的软件
    缺点:
        消耗网络资源过大,当网络不稳时,软件的使用也会不稳定

    B/S架构的软件:
        在浏览器上输入某软件的域名

2、网络编程

    网络编程发展历史:
        所有先进的技术都源自于军事,希望通过远程获取数据,所以有了网络编程   
    早期如何实现远程通信:
        - 打电话-->电话线
        - 纯平电脑 --> 网线,有线网卡
        - 笔记本电脑 --> 有线网卡,无线网卡

    要实现远程通信必须具备:
        1、物理连接介质 --> 网卡
        2、互联网协议
            - 人与人之间沟通的介质:中文、英文
            - 计算机之间沟通的介质:‘互联网协议’

3、互联网协议
互联网协议又称之为网络七层协议,OSI七层协议,OSI是一个世界标准组织

    OSI七层协议:
        - 应用层
        - 表示层
        - 会话层
        - 传输层
        - 网络层
        - 数据链路层
        - 物理连接层
学习由下到上:
    需要了解的协议共5层:

    - 物理连接层
        基于电信号发送二进制数据。
        如何切分

    - 数据链路层
        数据链路层的‘以太网协议’,主要用于处理基于电信号发送的二进制数据
        以太网协议:
            1、规定了电信号数据的分组方式
            2、每一台连接网线的电脑都必须要由一块‘网卡’。
                网卡由不同的厂商生产的
                    每块网卡都会有世界上独一无二的12位编号
                        前6位:厂商号
                        后6位:流水号
        - 交换机:
            可以让多台电脑连接在一起

        基于以太网协议发送数据:
            特点: 广播、单播
            缺点: 广播风暴、不能跨局域网通信。

        - 互联网:
            让局域网之间可以通信。

    - 网络层
        IP地址:用户标识唯一的一台计算机(局域网)的地址。
        IP: 点分十进制的数字
            最小值:0.0.0.0
            最大值:255.255.255.255
        IPV4:以前电脑不多,V4的IP地址数量够用
        IPV6:后来电脑多了,V4的IP地址数量不够了,扩容到V6

        本机IP:回环地址 127.0.0.1 --> localhost

    - 传输层
        TCP/UDP协议,他们都是基于端口操作

            TCP是流式协议

            - 端口号:标识电脑上的某个软件。
            - 端口号范围:0 — 65535
            注意:
                1、操作系统中,一般0-1024的端口都被默认使用了,不要动它
                2、尽量使用8000以后的端口号 8001

            开发中常用软件的默认端口号:
                mysql:3306
                mongodb:27017
                Django:8000
                Tomcat:8080
                Flask:5000
                Redis:6379

            若想服务端和客户端进行通信,必须要建立连接,产生两条管道。
                一条是客户端向服务端发送消息的
                另一条时服务端向客户端发送消息的
    - 应用层
        http
        ftp	

总结:
IP: 用于唯一标识某一台计算机的位置。
port:用于确认计算机上的某个应用软件

TCP协议的工作原理:

- TCP是一个流式协议

- 三次握手,四次挥手(*******):

  - 三次握手建连接:
    建立双向通道,建立好连接。
    三次握手过程:
    	第一次握手:建立连接时,客户端发送syn包到服务器,并进入SYN_SENT状态,等待服务器确认
	第二次握手:服务器收到syn包,确认客户的SYN,同时发送一个SYN包,即SYN+ACK包,此时服务器进入SYN_RECV状态;
	第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

  - 四次挥手断连接:
  第一次,客户端向服务端发出FIN请求,并且停止发送数据。客户端进入FIN-WAIT-1(终止等待1)状态。
  第二次,服务器收到请求,发出ACK确认,服务端进入CLOSE-WAIT(关闭等待)状态。
  等待,客户端收到服务器的确认后,此时,客户端就进入FIN-WAIT-2 (终止等待2)状态,等待服务器发送FIN请求(可能还需要接受服务器发送的最后的数据)。
  第三次,服务器将最后的数据发送完毕后,向客户端发送FIN请求,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
  第四次,客户端收到服务器的FIN请求,发出ACK确认,客户端就进入了TIME-WAIT(时间等待)状态。(注意:此时TCP连接还没有释放,必须经过2MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。)

5、socket

1.什么是Socket?
    socket是一个模块,可以写一套C/S架构的套接字。

2.为什么要使用Socket?
    socket套接字会封装好各层协议的工作。
    好处:
        可以节省开发成本。

3.如何使用
    import socket   
客户端:
import socket

client = socket.socket()

client.connect(('127.0.0.1', 9527))

while True:
    send_msg = input('client --> server:')

    client.send(send_msg.encode('utf8'))

    if send_msg == 'q':
        break

    data = client.recv(1024).decode('utf8')
    print(data)

client.close()    
服务端:
import socket

server = socket.socket()

server.bind(('127.0.0.1', 9527))

server.listen(5)

conn, addr = server.accept()
print(addr)

while True:
    data = conn.recv(1024).decode('utf8')
    print(data)

    if data == 'q':
        break

    send_msg = input('server --> client:').encode('utf8')
    conn.send(send_msg)

conn.close()

注意: 客户端与服务端必须尊循:
一端send,另一端recv
不同两端同时send或recv

posted @ 2019-10-17 16:06  AllenCH  阅读(110)  评论(0编辑  收藏  举报