9.5(day31)网络编程,socket套接字编程

网络编程

架构

架构
单机软件:只有c
C/S架构:c表示client,客户端,s表示server,服务端
B/S:b表示browser,浏览器服务端,s,server,服务端
B/S本质也是C/S,只不过客户端换成了浏览器

学习网络编程为了写CS架构软件
C端---网络---S端
S端:有固定的ip,稳定,支持并发,

网络协议

网络:网络连接介质+网络协议(osi七层协议)
七层:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层
五层:应用层,传输层,网络层,数据链路层,物理层
四层:应用层,传输层,网络层,网络接口层
'''
'''
网络协议:今天学的为五层(应传网数物),所有网络传输必须遵循
物理层:一堆电信号,二进制(0101110101),携带数据
数据链路层:
    遵循Ethernet,以太网协议,对物理层的电信号进行分组,
        一组电信号叫做一个数据报或者数据帧,每组数据分两部分,报头(发送者地址,
        6个字节,接受者地址:6个字节,数据类型,6个字节,报头固定18字节),数据部分
        (data,最少46字节,最多1500字节)
    mac地址;发送者接受者的地址就是mac地址,每个网卡都会有唯一mac地址,mac地址(
        前六位厂商编号,后六位流水线号)
    广播:同一个局域网内通信,所有人都能收到,会出现广播风暴
网络层:
    ip:ipv4通过32位2进制数表示,点分十进制,从0.0.0.0到255.255.255.255
        范围是有限的,不能表示所有网络设备,所以出现了ipv6,ip地址分为两部分,
        子网掩码:通过子网掩码和ip判断两个ip是否处在同一个网段,通过ip地址,子网掩码,做
         ip地址:  172.16.10.1:      10101100.00010000.00001010.000000001
        子网掩码:255.255.255.0:     11111111.11111111.11111111.000000000
        按位与运算:172.16.10.0      10101100.00010000.00001010.000000000
        172.16.10.10/24  包含了ip地址和子网掩码
        按位与运算(将ip地址,子网掩码用二进制表示,上下两个都为1为1,其余都为0)
        ip与mac有转换关系:ARP协议,通过广播发送数据包,获取目标mac地址,同一个网络下
        带着源mac,目标mac(未知),源ip,目标ip,数据,局域网内每个人都发一次
        mac地址学习:mac地址和ip地址的映射表,在第一次接受到就会在表中添加一条数据(相
        当于字典,一个mac地址对应一个ip地址)
        任何一种协议都有头和数据部分
传输层:
    tcp协议(好人协议):tcp连接是可靠的,三次握手(建立双向通路),四次挥手(断开双向通路)
    双向通路:C端给S端发送数据,S端也给C端发送数据
    tcp可靠原因:因为传输过程中CS必须回执,确保收到消息
    服务端如果大量看到syn_rcvd的状态,可能遭受攻击了
    dos攻击和ddos攻击:拒绝服务攻击,分布式拒绝服务攻击
    端口号:0-65535,系统占用端口:0-1023
    通过ip+子网掩码唯一确定一台设备
    通过ip+子网掩码+端口号唯一确定一个软件
    半连接池:建立双向通路的请求放到半连接池中,队列,先进先出,通过软件(连接池大小不是控制
    的链接数,而是链接在中间状态的连接数)
    控制,有内存来放,所以dos攻击无法防范,
    (udp):不可靠传输,不需要相应
socket(抽象层,在应用层与其他层之间,抽象tcp,ip写成简单的接口)
    在python中通过socket写一个CS架构的软件
应用层:
    根据应用程序
    http协议
    ftp协议
    邮件协议

上网流程分析

上网流程分析:
    浏览器输入地址,
    会去DNS服务器,通过域名解析成ip地址加端口号
    向ip+端口号这个地址发送请求,底层基于socket

三次握手

四次挥手

socket

# 简单通信客户端
import socket
# 先导入模块

# 想想买手机打电话,SOCK_STREAM.tcp链接,udp链接用SOCK_DGRAM
soc = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 相同机器通讯:AF_UNIX   不同机器通讯:AF_INET
# 插卡,传ip地址,端口号
soc.bind(('192.168.11.209',8080))
# 如果写本机ip,外部可以访问,127.0.0.1只能自己访问
# 开机,监听
soc.listen(5)   # 5是半连接池大小
conn,addr = soc.accept()   # 等别人给打电话
data = conn.recv(1024)
print(data)
# conn就是通路,
# conn.send发送数据,数据必须是二进制格式
conn.send(b'nihao')
# 挂断电话
conn.close()
# 销毁手机
soc.close()
# import socket
# # 创建soc对象
# soc = socket.socket()
# # 链接服务端地址
# soc.connect(('192.168.11.209',8080))
# # 发送消息
# soc.send(b'hellosir')
# data = soc.recv(1024)
# print('shoudao',data)
# soc.close()
posted @ 2019-09-16 20:01  ZJJJJJJJ  阅读(124)  评论(0编辑  收藏  举报