计算机网络基础 和 socket模块

(1) a:  c/s  架构  :  client  客户端   和 server 服务器端         能充分发挥pc的性能   

      b:  b/s  架构 : browser  浏览器  和 server 服务器端     隶属于c/s架构     统一了应用的接口

(2)知识点:

    1,mac地址 ;  是一个物理地址,全球唯一,类似于身份证    是一个十六进制的12位数

    2  ip地址 :   是一个四位点分十进制,它标识了计算机在网络中的位置,类似于学号

    3,  交换机的通信方式 ; 广播:吼一嗓子   单播:  一对一    组播:  一对多

    4, arp协议: 通过目标ip地址获取目标mac地址的一个协议

    5,  端口:  操作系统为本机上每一个运行的程序都随机分配一个端口,其他电脑上的程序可以通过端口获取到这个程序

          ip地址  +  端口  能唯一找到某台电脑上的某个程序

    6,   路由器:     分隔并连接不同的网段

    7,   网关:   类似于局域网的出口和入口

    8,   网段:  一个局域网内的ip地址范围

    9:   子网掩码:   子网掩码  &  ip地址    得到网段

    10:   osi  五层模型

        应用层    :    http,https,ftp

        传输层    :    tcp/udp         四层交换机和路由器

        网络层     :    ip协议         三层交换机和路由器

        数据链路层:  arp协议       以太网交换机   网卡  网桥

        物理层     :   传输电信号      集线器,网线  光纤

 3,socket   模块  又叫做套接字    有多种类型的,一般用两种

          sk = socket.socket(family = AF_INET, type=SOCK_STREAM)

family:

         AF_UNIX基于文件类型的套接字   基于unix系统开发,为了同一台电脑上多个程序直接通信,unix系统的中心思想是 : 一切皆文件

         AF_INET基于网络类型的套接字

type:

         SOCK_STREAM      字节流类型   ===>    tcp协议  可靠的,面向连接的, 面向字节流形式的传输方式

          SOCK_DGRAM        报文类型     ===>     udp协议  不可靠的,不面向连接的,面向数据包的传输方式,但是它快

利用tcp 实现一个简单的交互

#服务器端
# import socket
# ret = socket.socket()                  #括号内不传参数,默认 family = 基于网络类型的套接字(AF_INET), type = SOCK_DGRAM
# ret.bind(('192.168.12.104',18080))     #端口的范围0-65535   但是0-1023 是给操作系统用的不让用
# ret.listen()                           #打开可被连接状态
# conn,addr = ret.accept()               #等待接受客户端连接的连接,阻塞等待
# s1 = conn.recv(10000)                  #接收数据,指定最高接受某个字节
# print(s1.decode('utf-8'),addr)         #将接受到的byte解码成需要的格式
# s1.close()                             #关闭本次连接
# ret.close()                            #关闭服务器
#客户端
# import socket
# ret = socket.socket()                      #实例化一个类
# ret.connect(('192.168.12.104',18080))    #连接服务器的IP.和端口   定位到程序
# ret.send('你好啊!'.encode('utf-8'))       #发送byte类型的数据类型,如果是中文需要编码
# ret.close()                                 #关闭连接
View Code

 4,tcp协议:     '127.0.0.1'每个计算机都有这么一个本机地址,只能被本机识别,不能被其他机器识别

    tcp协议一次只能链接一个客户端,不能同时和多个客户端通信

    tcp协议的三次握手:  注意:一定是client先发起请求

                                       a: 客户端向服务器发送链接请求

                                       b: 服务器收到请求并返回客户端请求连接

                                       c: 客户端回应可以连接

    tcp协议的四次挥手:   注意:双发谁先发起断开连接都可以

                                       a;客户端发起断开连接的请求(如果你有数据需要发送,可以继续接受)

                                       b:服务器回复:我收到你的请求了

                                       c;服务器发送已经准备好断开连接了

                                       d:客户端回复:收到你的信息,断开连接

 5TCP协议实现远程操作系统的文件编程    

# TCP协议实现远程操作主机(服务器端)
import socket
import subprocess
ret = socket.socket()
ret.bind(('127.0.0.1',9528))
ret.listen()

conn,addr = ret.accept()
while 1:
    num = conn.recv(1024).decode('utf-8')         #接受远程客户端的命令,当作系统命令
    s1 = subprocess.Popen(num,shell=True,         #告诉本服务器(主机)操作系统,将cmd当成系统命令去执行
                          stdout=subprocess.PIPE, #是执行完系统命令之后,用于保存正确结果的一个管道
                          stderr=subprocess.PIPE) #是执行完系统命令之后,用于保存错误结果的一个管道
    stdout = s1.stdout.read()
    stderr = s1.stderr.read()
    conn.send(stdout+stderr)                      #双显示,择一显示
conn.close()
ret.close()

# TCP协议实现远程操作主机(客户端)
import socket
ret = socket.socket()
ret.connect_ex(('127.0.0.1',9528))
while 1:
    num = input('请输入你要操作的命令:')
    ret.send(num.encode('utf-8'))
    a = ret.recv(1024).decode('gbk')
    print(a)
ret.close()
View Code

6,TCP协议实现聊天

#TCP协议实现互相聊天(服务器)
import socket
ret = socket.socket()
ret.bind(('127.0.0.1',9527))
ret.listen()
info,addr = ret.accept()
# print(info)
while 1:
    msg = info.recv(2048).decode('utf-8')
    if msg.upper() == 'Q':
        break
    print('33[31;42m',msg,'33[0m')
    msn = input('请输入要发送的消息:').encode('utf-8')
    if msn.upper() == 'Q':
        break
   info.send(msn)
info.close()
ret.close()

#TCP协议实现互相聊天(客户端)
import socket
ret = socket.socket()
ret.connect(('127.0.0.1',9527))
while 1:
    msn = input('请输入要发送的消息:')
    if msn.upper() == 'Q':
        break
    ret.send(msn.encode('utf-8'))
    msg = ret.recv(2048).decode('utf-8')
    if msg.upper() == 'Q':
        break
    print('33[31;42m',msg,'33[0m')
ret.close()

7,粘包问题          注意::  只有tcp协议才会发送粘包,udp不会发送

     一,TCP协议中:(粘包的发生过程)

(1)当发送端多次连续发送且发送间隔较小的数据,tcp协议中会用合包机制(nagle算法),会等待这些数据打包成一块发送,数据没有切割符,有时会粘包

(2)当发送端发送较大数据的时候,因受到网卡MTU的限制,会将数据进行拆分成多个小的数据(拆分机制,发生在发送端)

    当传送到目标主机后,操作系统会将多个小的数据合并成原本的数据

     二,UDP协议中    (究竟一次收发多少字节合适?)

  传输层:udp协议对一次收发数据大小的限制是: 65535 - ip包头(20) - udp包头(8) = 65507 

  数据链路层:由于MTU的限制  一次收发数据的大小被限制在  1500 - ip包头(20) - udp包头(8) = 1472

  结论:

          1472< 数据大小<65507   会在数据链路层拆包,因为是不可靠协议,拆分之后,如果丢任意一个数据包,那么此次数据传输失败

    

   

   

   

原文地址:https://www.cnblogs.com/laogao123/p/9456772.html