网络编程

网络编程: 编写一个基于网络才能工作的程序

学习网络编程目的:数据间的交互,利用网络可以访问别人的数据

一 、客户端/服务器架构 (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协议

  作用:减少网络编程工作量

  

  

    

原文地址:https://www.cnblogs.com/Afrafre/p/10150514.html