网络编程: 编写一个基于网络才能工作的程序
学习网络编程目的:数据间的交互,利用网络可以访问别人的数据
一 、客户端/服务器架构 (c/s架构)
客户端: 接收数据的一方 (例如:腾讯视频客户端)
服务器:提供数据的一方 (例如腾讯服务端)
浏览器也是客户端 B/S 架构也是C/S 架构的一种
二、OSI 七层协议:
应用层,表示层,会话层,传输层,网络层,数据链路层,物理层
简化为五层:应用层,传输层,网络层,数据链路层,物理层
1. 物理层: 主要基于电器特性放松高低电压,高电压对应数字1,低电压对应数字0
2.数据链路层: 定义了电信号的分组方式
统一的分组方式标准,以太网协议 ethernet
---一组电信号构成一个数据包,叫做‘帧’
--- 每一数据帧分为:报头head 和data 两部分
head : (发送者/源地址,6个字节) (接收者/目标地址,6个字节)(数据类型,6个字节)
data 包括:(最短46字节,最长1500字节)
mac 地址: head中源和目标地址的由来:以太协议规定介入Internet的设备必须具备网卡,发送端和接收端的地址便是网卡的地址,及mac地址
mac地址:每块网卡出厂时烧制唯一的mac地址,长度为48位2进制
广播:ethernet 采用最袁术的方式,广播的方式进行通信,即计算机基本靠吼
三、网络层
有了ethernet , mac地址,广播发送方式,世界上的计算机可以通信
网络层作用:为了降低广播次数和广播访问,引用了一套新的地址(网络地址)区分不同的子网
IP协议:规定网络地址的协议,网络地址由32位2进制表示
范围0.0.0.0 - 255.255.255.255
例: 172.16.10.1 前三部分叫网络号,最后一部分叫主机号。(单纯的ip地址不能区分所在的子网)
IP地址分类: A 政府 B 大型公司 C 每个人(局域网内有效) D组播 E 用于实验
子网掩码:用来判断两个ip地址是否在同一局域网中 (c类中地址是共享的,单独使用网络号无法区分子网)
怎么区分:将两个ip地址二进制与子网掩码分别进行AND 运算,比较是否相同
IP协议总结: 为每一台计算机分配IP地址,确定哪些地址在同一个子网络中。
ip 数据包:以太网头, ip 头, ip数据
ARP协议:计算机发包时刻获取自身的mac时容易的,但如何获取目标逐句的mac ,就需要通过arp协议
ARP协议的功能:广播的方式发送数据包,获取目标主机的mac地址
例: 主机172.16.10.10/24访问172.16.10.11/24
1. 通过ip地址和子网掩码区分自己所在的子网
同一子网: 目标主机ip , 目标主机mac
不同子网: 网关mac, 目标主机ip
2.分析两个ip是否出在同一子网,如果在不同的子网当中,通过arp获取的是网关的mac
源mac, 目标mac, 源ip, 目标ip
先找网关,返回网关的mac,在组成数据帧
四、传输层
传输层由来: 网络层的ip帮我们区分子网,以太网的mac帮我们找到主机
当网络层找到电脑以后,需要定位应用程序-----> 通过端口
端口:应用程序与网卡关联的编号(端口范围: 0- 65535, 0-1023 位系统占用端口)
传输层的功能: 端口到端口的通信
小结: IP 用来标识局域网中某台电脑
端口:用来标识某个应用程序
TCP: (transmission control protocol)
是一种可靠的传输协议,保证数据传输可靠
以太网头,ip 头, tcp头,数据
如何保证数据传输的可靠性:传输前三次握手,断开前四次挥手
三次握手过程:
第一次握手:两端都出在CLOSED关闭状态,Client 将标志位SYN置为1,随机产生一个值seq = x, 并将该数据包发送给Server,Client 进入SYN-SENT 状态,等待Server确认
第二次握手:Server 收到数据包以后由标志位SYN = 1得知Client 请求建立连接,Server将标志位SYN 和 ACK都置为1, ack = x+1, 随机产生一个值seq = y, 并将该数据包发送给Client以确认连接请求,Server进入SYN-RCVD状态,此时操作系统为该TCP连接分配TCP缓存和变量
第三次握手:Client 收到确认后,检查ack是否为x+1, ack是否为1, 如果正确则将标志位ACk置为1, ack = y+1 并且此时操作系统为该TCP连接分配TCP缓存和变量,并将该数据包发送给Server, server检查ack是否为y+1, ACK是否为1, 如果正确则连接建立成功,Client和Server进入ESTABLISHED 状态,完成握手,随后client和server可以传输数据
四次挥手过程:
第一次挥手:客户端发送一个FIN包(FIN = 1, 随机产生一个值给seg,seg = u)给服务端,用来关闭客户端到服务端的数据传输,客户端进入FIN_WAIT_1状态
第二次挥手:服务器收到FIN包后,发送一个ACK包(ACK = 1, ack = u+1,再随机产生一个值给seg,seg = v)给客户端,客户端进入CLOSE_WAIT 状态
第三次挥手: 服务器端发送一个FIN包(FIN = 1,ACK = 1, ack = u+1, 在随机产生一个值给seg,seg = w)给客户端,用来关闭服务器端到客户端的数据传输,服务器端进入LAST_ACK状态
第四次挥手:客户端接收FIN包,然后进入TIME_WAIT 状态,接着发送一个ACK包(ACK = 1,seq = u+1, ack = w+1)给服务端,服务器端确认序号,进入CLOSED 状态,完成挥手
总结: 数据的传输层: 我方层层封包,对方层层解包
socket: 位于应用层和传输层中间
是python提供的一个模块,用于处理网络传输
封装了底层复杂的TCP和UDP协议
作用:减少网络编程工作量