一 五层协议详解:

          物理层 电信号:01010101101 a - 97

    数据链路层  对电信号 分组 使数字有意义  分组协议 = Ethernet协议 = 以太网协议 -> 网卡 mac地址(唯一的)  mac(同一个子网)
              head(18字节 = 6 源地址(mac) 6 目标地址(mac) 6 数据的描述) + data     mac_head + ip_head + data
         以太网的工作模式: 广播 --> 以太网基于mac地址的广播的方式来完成数据的传递 --> 只能在局域网完成 局域网才能找对对方
         ARP 协议 把ip地址解析成mac地址
    网络层:     IPv4 IPv6   head(IP头 源地址+目的地址) + data      iphead+data    ip(哪一个子网)   iphead + heac(tcp/udp) + data
         ip + mac 就能找到全世界中唯一的计算机 ip->找到哪一个子网 mac->找到具体哪一台机器
   传输层      tcp + udp  格式: head(tcp/udp) + data   tcp/udp 基于端口工作的  端口:0 - 65535  一个软件一个端口 0-1024给操作系统使用的
ip+端口 就能找到全世界范围内的唯一一个软件 head(tcp) + head(应用头) + data
服务端最好一直对外提供 服务端的端口和ip要捆绑固定 不能随便变 客户端的端口可随便变
    应用层      暴风 qq ... 软件  格式: head(应用头)+data    应用协议:http/ftp..

五层串起来:--->: 应用层产生数据head(固定长度)+data -> 传输层 -> 网络层 - > 数据链路层 -> 物理层

总结:用快递来说明这个列子  一个产品就是物理层, 快递单就是圆通还是中通,也就是tcp和udp协议  发快递必须有快递单 ip头,自己地址和对方地址就是data数据

地区分为上海。。。那就是以太网报头 规定是18个字节,包裹数据就是data数据,物理层就是快递设备

二 传输层详解:

 tcp:流式协议: 像流水一样 发数据 管道数据 双向管道  c ----> s    c  <----- s  没有数据前 ,先建立管道

   挖管道:

    1. client    发个请求数据包   创建一条管道数据   # tcp = 1

               2.server        回应了,也要创建一条数据管道 确认+请求

               3.client       回应了,可以    # c ----- s    s ------- c  三次握手

   tcp: 是可靠传输  s 得到包之后回应收到  c 确认没有收到 就在传一遍 所以叫可靠传输

      upd: client 一直发数据,不需要对方回应,不管出现什么情况,都一直发,所以不可靠

 

 总结: tpc 效率低,但是可靠

             upd 效率高,但是不可靠   不需要管道, 不需要等待对方回应 64k

三 什么是socket

  socket 是什么?

    

  socket 理解就是ip+端口

      套接字2种:

    1. 基于文件套接字  AF_UNIX

               2. 基于网络套接字 AF_INET

  套接字流程:

  

四 基于socket实现简单套接字通信

1.服务端.py

 1 import socket
 2 
 3 # 1.买手机
 4 # socket.AF_INET 基于网络通信 socket.SOCK_STREAM 基于tcp协议
 5 phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 6 # print(phone)
 7 # 2.绑定手机卡
 8 phone.bind(("127.0.0.1", 8081))     # 0-1024给系统使用的
 9 
10 # 3.开机
11 phone.listen(5)     # 监听系统最大链接数为5
12 
13 # 4.等电话链接
14 # res = phone.accept()
15 conn, clinet_addr = phone.accept()
16 
17 # 5.收发消息
18 data = conn.recv(1024)  # bytes  2.1024代表最大接受1024个bytes
19 print("客户端的数据", data)
20 
21 conn.send(data.upper())
22 
23 # 6.挂电话
24 conn.close()

2.客户端.py

import socket

# 1.买手机
# socket.AF_INET 基于网络通信 socket.SOCK_STREAM 基于tcp协议
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# print(phone)
# 2.拨号
phone.connect(("127.0.0.1", 8081))

# 发,收消息
phone.send("hello".encode("utf-8"))

data = phone.recv(1024)
print("客户端收到服务端的数据:", data)

# 关闭
phone.close()

 5.在简单的套接字基础上加上通信循环

客户端:

# 发,收消息
while True:
    msg = input(">>:").strip()
    phone.send(msg.encode("utf-8"))
    data = phone.recv(1024)
    print("客户端收到服务端的数据:", data)

服务端:

# 5.收发消息
while True:
    data = conn.recv(1024)  # bytes  2.1024代表最大接受1024个bytes
    print("客户端的数据", data)

    conn.send(data.upper())

 

 

 

   

posted on 2018-08-19 21:56  我爱python,人生苦短  阅读(127)  评论(0编辑  收藏  举报