网络编程部分详解

一、网络结构

1、网络结构分为两种如下:

C/S:client---基于网络通信------server

B/S:browser---基于网络通信----server

server端必须满足的条件如下:

    1、1:保持server端能够稳定运行

    1、2:server端必须有一个固定的ip地址

    1、3:server端必须支持并发

2、什么是互联网?

互联网其本质就是由一系列协议(统一的标准)组成,其总称为‘互联网协议’。

互联网协议的功能:定义计算机如何接入internet,以及接入internet的计算机通信的标准。

互联网必须满足的两大要素:

    1、有着良好的物理底层连接介质保持网络间的通信

    2、必须有着一个统一的标准

补充:互联网协议可以相比着理解为其就像计算机界的英语

3、osi七层协议(我们只需掌握五层协议就行)

osi协议可以理解为是对互联网协议的划分,且osi协议可以划分为七层或五层或四层。

osi协议分层详情如下:

关于osi五层协议的详解:

物理层:指的是两台计算机通过某种连接介质连接到inter网

物理层的功能:通过高低电平来表示0/1,高电平代表1、低电平代表0

数据链路层:单纯的定义0和1没有任何意义所以必须通过数据链路层中的协议将0和1组合成一个有着意义的信息

数据链路层功能:定义了0和1的分组方式

数据链路层中包含的协议如下:

以太网协议Ethernet:

以太网协议:是一个被公认的统一的标准且以太网协议中数据是由一组0和1组成的数据包也叫帧,

每一个帧都包括报头head和数据data;每一个报头都有着固定的长度(18个字节)

报头包含有(源地址与目标地址)

Mac地址:

简述:Mac地址是由48位2进制数组成或者由12位16进制数组成,且每一个Mac地址在电脑硬件中代表的是网卡,

每一个网卡在出场的时候就已经以(前六位表示厂商编号,后六位便是流水线号)被烧制好了。

广播:

广播:有了Mac地址并处于统一连接的一台主机可以通过ARP协议获取另外一台计算机的Mac地址从而达到通信,且以广播的形式

进行通信即计算机通信基本靠吼。

网络层:是由一个个局域网组成的且局域网是以广播的形式进行通信的

网络层功能:(为了区分两台主机是否处于同一个局域网)引入一套新的地址用来区分不同的广播域/子网,这套地址即网络地址。

网络层的协议如下:

ip协议:

  • 规定网络地址的协议叫ip协议,它定义的地址称之为ip地址,广泛采用的v4版本即ipv4,它规定网络地址由32位2进制表示
  • 范围0.0.0.0-255.255.255.255
  • 一个ip地址通常写成四段十进制数,例:172.16.10.1

子网掩码:所谓”子网掩码”,就是表示子网络特征的一个参数。它在形式上等同于IP地址,也是一个32位二进制数字,比如ip172.16.10.1其对应的二进制码是:10101100.00010000.00001010.000000001

了解:有了ip地址与子网掩码就可以判断两台计算机是否在同一个子网(局域网),如果两台计算机有着共同的子网掩码,就可以用子网掩码与ip的二进制码进行比较(都是1是为1,否则为0)的结果如果相同就表示它们在同一个子网。

ARP协议

arp协议由来:计算机通信基本靠吼,即广播的方式,所有上层的包到最后都要封装上以太网头,然后通过以太网协议发送。

ARP协议功能:以广播的方式发送数据包从而获取对方的Mac地址。

ARP功能具体实现如下:

传输层:

传输层的由来:网络层的ip帮我们区分子网,以太网层的mac帮我们找到主机,然后大家使用的都是应用程序所以可以通过ip+mac地址去找一个特定主机,如何标识这台主机上的应用程序,答案就是端口,端口即应用程序与网卡关联的编号。

传输层功能:建立端口到端口的通信

补充:端口范围0-65535,0-1023为系统占用端口

tcp协议:

可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。

udp协议:

不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包。

三次握手和四次挥手图示如下:

应用层:规定应用程序的数据格式且其协议可以自定义

4、socket 套接字

socket层图如下:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4.1 socket套接字的演变史

基于文件类型的套接字家族:AF_UNIX

基于网络通信类型的套接字家族:AF_IENT(我们常用的)

4.2基于tcp协议与udp协议通信的套接字

服务端tcp:

import socket
ip_dic=('127.0.0.1',2206)
base_lient=1024
server1=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
server1.bind(ip_dic)
while True:
    msg,adder=server1.recvfrom(base_lient)
    print(msg,adder)
    server1.sendto(msg,adder)
View Code

客户端tcp:

import socket
ip_list=('127.0.0.1',2206)
base_lient=1024
phone=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
    mag=input('>>>:').strip()
    if not mag:
        continue
    phone.sendto(mag.encode('utf-8'),ip_list)
    mag,adder=phone.recvfrom(base_lient)
    print(mag.decode('utf-8'),adder)
View Code

服务端 udp:

from socket import *
ip_port=('127.0.0.1',8080)
ip_base=1024
server=socket(AF_INET,SOCK_DGRAM)
server.bind(ip_port)
while True:
    try:
        data,sock=server.recvfrom(ip_base)
        server.sendto(data,sock)
    except ConnectionResetError:
        break
server.close()
View Code

客户端 udp:

from socket import *
ip_port=('127.0.0.1',8080)
ip_base=1024
client=socket(AF_INET,SOCK_DGRAM)
while True:
     msg=input('>>>:').strip()
     if len(msg)==0:
         continue
     client.sendto(msg.encode('utf-8'),ip_port)
     data,sock=client.recvfrom(ip_base)
     print(data)
client.close()
View Code
原文地址:https://www.cnblogs.com/ageliu/p/9600902.html