1.五层协议详解,2.传输层详解,3.什么是socket,4.基于socket实现简单套接字通讯,5.在简单的套接字基础上加上通讯循环

一 五层协议详解:网络

          物理层 电信号:01010101101 a - 97socket

    数据链路层  对电信号 分组 使数字有意义  分组协议 = 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数据 tcp

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

二 传输层详解:操作系统

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

   挖管道:server

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

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

               3.client       回应了,能够    # c ----- s    s ------- c  三次握手utf-8

   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())
相关文章
相关标签/搜索