网络编程与简单的通信

网络编程

C/S和B/S

c:client s:server 客户端,服务端,电脑上装的qq,微信

b:browser s:server 浏览器 服务端,京东,天猫

bs架构本质也是cs

学习网络编程就是为了写一个cs架构的软件

模式为:c端-------网络-----s端

S端的特点:

​ 1 有固定ip
​ 2 稳定一直在运行,支持并发

网络协议

网络协议一般分为七层,但也可以将其分为五层,这里以五层来进行详细叙述

img

物理层

010101电信号

数据链路层

把物理层的电信号分组,每一组叫一个数据报/数据帧,每一数据帧分成:报头head和数据data两部分
每一个数据报,都由报头和数据部分
头:固定18个字节,6:发送者地址/6:接收者地址/6:数据类型
mac地址 :发送者,接收者地址,就是mac地址
每块网卡都有一个唯一mac地址:12位16进制数表示(前六位是厂商编号,后六位是流水线号)

广播:同一个局域网内通信 ,会出现广播风暴

网络层

ip :ipv4:32位2进制表示:点分十进制表示 从0.0.0.0到255.255.255.255,范围是有限的,不能表示出所有的网络设备,于是出现了ipv6
子网掩码:通过子网掩码和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跟mac有转换关系
主机172.16.10.10/24访问172.16.10.11/24
ARP协议:广播的方式发送数据包,获取目标主机的mac地址
mac地址学习:mac地址和ip地址的映射表
第一次接收到就会在ip/mac映射表中添加一条数据{’172.16.10.11“:ddf(mac地址)}
任何一种协议都有头和内容

传输层

tcp协议:
-三次握手,四次挥手(重点,看图),连接如何建立,发数据如何保证可靠,断开如何断开,在建立连接过程中有状态

img

​ -服务的如果看到大量的syn_rcvd状态
​ -dos和ddos攻击:拒绝服务攻击,分布式的拒绝服务攻击
​ -端口号:端口范围0-65535,0-1023为系统占用端口
udp协议:
​ -发送,不需要要响应,所以数据不可以靠,(看视频)
端口
​ -通过ip+子网掩码唯一确定一台设备
​ -通过ip+子网掩码唯+端口号唯一确定一个软件
半连接池

应用层

上网流程分析:
-在浏览器输入www.baidu.com
-会取dns服务器通过域名解析成ip地址
-向ip+端口号这个地址发送请求,就会访问到百度的服务器

socket:在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信

简单的通信

我们可以用socket实现一个简单的通信,它分为服务端和客户端

服务端

import socket

#想象成买手机打电话:socket.SOCK_STREAM 表示建立tcp连接 ,udp连接socket.SOCK_DGRAM
#买了个手机
soc=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#插电话卡:绑定ip地址  传元组:(ip,端口号)
soc.bind(('192.168.11.146',8080))  #如果写本机ip,局域网外部可以访问
# soc.bind(('127.0.0.1',8080))    #如果写127.0.0.1,只能自己访问

#开机,监听,这个5 是半连接池的大小
soc.listen(5)
#等待别人给我打电话
print('xxxx')
conn,addr=soc.accept()
print('yyyy')
print(addr)
# conn 就是通路
#接收1024个字节
data=conn.recv(1024)
print('我收到客户端发的',data)
#conn.send  发送数据,数据必须是bytes格式
conn.send(b'xxxxx')

#挂断电话
conn.close()
#销毁手机
soc.close()

客户端

import socket
#创建一个socket对象
soc=socket.socket()
#连接服务端
soc.connect(('192.168.11.146',8080))
#发送消息
soc.send(b'xxx')

data=soc.recv(1024)
print('我收到服务端回的',data)
#关闭连接
soc.close()
posted @ 2019-09-05 15:48  黑井白子  阅读(143)  评论(0编辑  收藏  举报
Live2D