网络基础

OSI参考模型

OSI参考模型是国际标准化组织分析计算机通信,把计算机通信进行的规范和标准化分成了7层:
1)应用层:所有能产生网络流量的程序(QQ,浏览器)
2)表示层:数据传输前的压缩,加密,确定编码方式等操作
3)会话层:查看木马(netstat -nb)只要需要网络请求,必定会建立会话
4)传输层:可靠传输,不可靠传输,流量控制
5)网络层:负责选择最佳路径,规划IP地址
6)数据链路层:帧的开始和结尾,透明传输,查看校验
7)物理层:接口标准,电器标准

TCP/IP协议
意为传输控制协议,由[网络层]的IP协议和[传输层]的TCP协议组成。
TCP协议
1)需要传输的文件分段传输
2)建立会话
3)可靠传输
4)流量控制
UDP协议
1)一个数据包就能完成数据通信
2)不需要建立会话
3)不可靠传输
4)不需要流量控制


网络基础_第1张图片
image.png
网络基础_第2张图片
image.png

网络基础_第3张图片
image.png

网络基础_第4张图片
image.png

网络基础_第5张图片
image.png

URL(Uniform Resource Locator)
统一资源定位符
通过一个URL,就能找到互联网上唯一的1个资源
URL就是资源的地址,位置,互联网上的每个资源都有一个唯一的URL

URL的基本格式=协议://主机地址/路径
http://www.1000phone.com/img/logo.png
协议:http 不同的协议代表不同的资源查找方式,资源传输方式
主机地址:www.1000phone.com存放资源的主机(服务器)的IP地址(域名)
路径:img/logo.png 资源在主机(服务器)中的具体位置

HTTP:超文本传输协议,访问的是远程的网络资源,格式是http://
http协议是在网络开发中最常用的协议
作用是规定客户端和服务器之间的数据传输格式,让客户端和服务器能有效地进行数据沟通


网络基础_第6张图片
image.png

完整的http通信分为两步:
请求:客户端向服务器索要数据
响应:服务器返回客户端相应的数据

请求包括请求头(客户端的环境描述,客户端请求信息)
请求体:客户端发给服务器的具体数据
响应包含响应头(服务器的描述,对返回数据的描述)
响应体:服务器返回给客户端的具体数据,比如文件

常见响应状态码


网络基础_第7张图片
image.png

网络基础_第8张图片
image.png

网络基础_第9张图片
image.png

一.socket 编程

socket又叫套接字,就是进行数据通信两端,分为服务端套接字和客户端套接字
套接字编程:自己写服务器和客户端,进行数据传输
python对socket编程的支持:提供一个socket的库(内置)

写一个服务器

import socket

def creat_server():
    """写一个服务器"""
    #1.创建套接字对象
    """
    socket(family,type)
    a.family:确定IP协议类型
    AF_INET:ipv4(默认)
    AF_INET6:ipv6
    b.type:传输协议类型
    SOCK_STREAM:TCP协议(默认)
    SOCK_DGRAM:UDP协议
    """
    server = socket.socket(family=socket.AF_INET,type=socket.SOCK_STREAM)

    #2.绑定IP地址和端口
    """
    bind((ip地址,端口))
    端口:一台电脑上一个端口标记一个唯一的服务.范围0-65535,0-1024是著名端口,专门用来标记特殊服务,一般不用
        但是,同一个端口同一时间只能绑定一个服务
    """

    server.bind(('10.7.153.122',8080))

    #3. 开始监听(监听的是客户端的请求)
    """
    listen(最大个数)
    同一时间能够连接的客户端的个数
    """
    server.listen(512)

    #4.让服务器处于运行状态
    while True:
        print('监听状态')
        #5.连接客户端(建立连接),返回连接对象和客户端地址
        #connect,addr = server.accept()这句代码会阻塞线程,直到有客户端来请求当前服务器为止
        connect,addr = server.accept()


        #6. 服务器给客户端发送消息
        """
        send(data)
        data:python3要求类型是bytes二进制,python2可以是字符串
        补:
        字符串(str)转二进制(bytes):
        字符串.encode(编码方式默认utf-8)
        bytes(字符串,encoding=)
     
        """
        while True:
            message=input('服务器:')
            connect.send(message.encode())
           
            #7.接受从客户端发送过来的消息
            #注意:recv方法也会阻塞线程
            """
            recv(bufsize)
            bufsize:每次能够接收的最大的字节数
            返回值:接收到的数据,类型是bytes
            
            2.二进制转字符串:
            二进制.decode()
            str(二进制,编码方式)
            """
            recv_data = connect.recv(1024)
            #print(recv_data.decode())
            print(str(recv_data,'utf-8'))


        #8.断开连接
        connect.close()

creat_server()

二.客户端套接字

import socket

def creat_client():
    #1.创建套接字对象
    client = socket.socket()

    #2.连接服务器
    """
    connect(服务器地址)
    """

    client.connect(('10.7.153.127',8080))
    while True:
        #3.接收服务器发送的消息

        data = client.recv(1024)
        print(data.decode(encoding='utf-8'))

        #4.给服务器发送消息
        message = input("客户端:")
        client.send(message.encode())

    #5.断开连接
    client.close()



creat_client()

三.图片传输

图片传输是一部分一部分接收的

import socket
# 1.创建套接字(创建一个座机)
server = socket.socket()
# 2.绑定地址(插电话线,绑定电话号码)
server.bind(('10.7.153.122',12345))
# 3.监听(人坐在电话旁)
server.listen(512)
#保证电话可以被打通(等电话)
while True:
    # 4.接收请求(接电话)
    connect,addr = server.accept()

    # 5.发送数据(讲电话)
    with open('./files/1.jpg','br') as f:
        data = f.read()

    connect.send(data)

    # 6.接收数据(听)
    #connect.recv(1024)

    # 7.关闭连接(挂)
    connect.close()
import socket

client = socket.socket()
client.connect(('10.7.153.122',12345))
#创建一个空的二进制数据
all_data = bytes()
#接收从服务器传回来的数据

data = client.recv(1024)
while data:
    print('接收到数据')
    all_data += data
    data = client.recv(1024)

with open('./files/new.jpg','wb')as f:
    f.write(all_data)

client.close()

四.http请求

import requests

#1.准备url
url = 'https://www.apiopen.top/satinApi?type=1&page=1'

#2.发送请求(GET请求)
"""
get(url,参数对应的字典)
post(url,参数对应的字典)
返回值是服务器返回的响应

"""
response = requests.get(url)
#requests.get('https://www.apiopen.top/satinApi',{'type':1,'page':1})
print(response)


#3.通过响应获取服务器返回的数据
#a.获取字符串类型的数据
print(response.text)

#b.获取json格式的数据
print(response.json()['msg'])
print(response.json())

#c.获取二进制格式的数据
print(response.content)

#{'Server': 'nginx', 'Date': 'Wed, 12 Sep 2018 09:06:56 GMT', 'Content-Type': 'application/json;charset=utf-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'POST, GET, OPTIONS, DELETE', 'Access-Control-Max-Age': '3600', 'Access-Control-Allow-Headers': 'x-requested-with'}
#4.获取响应头(了解)
print(response.headers)

你可能感兴趣的:(网络基础)