ネットワークプログラミング(基礎知識)

ネットワークプログラミング(基礎知識)

  • ネットワークの必需品
  • ネットワークプログラミング(Pythonコード)
  • B/S および C/S アーキテクチャ

1. 必須の基礎

1.1 インフラストラクチャ

1.1.1 スイッチ

他の 2 人のルームメイトも自分のコンピューターに接続してリソースを共有するにはどうすればよいですか? 現時点では、ローカル エリア ネットワークを形成するためにデバイス [レイヤー 2 スイッチ] が必要です。

当电脑接入交换机之后,我们需要为每台电脑分配一个IP,例如:
    - 电脑1192.168.10.1
    - 电脑2192.168.10.2
    - 电脑3192.168.10.3
    - 电脑4192.168.10.4
局域网内容个电脑之间是基于ARP协议来进行通信,例如:A电脑向 IP为192.168.10.3的另一个电脑发送消息。

第一步:A封装数据包,此时只知道目标IP不知道目标mac地址(未知mac地址时默认会设置为FF)。
第二步:将数据包发送到交换机,交换机通过广播的形式将数据发送给所有电脑。
第三步:目标电脑接收到数据包后,监测自己是否是目标IP。
		- 是,收到数据并回复。
		- 不是,则丢弃包。

为防止每次发送消息都是广播形式,每台电脑的内部都为维护了一个ARP表,接受到数据时(无论是否自己的)都会记录自己了解的IP和MAC的对应关系,例如:
    Internet地址			       物理地址
    192.168.10.1            14-9d-da-2a-dd-0a
    192.168.10.3            14-9d-da-2a-dd-0c
    ...
    
以便于下次在发送消息时,就知道了目标的mac地址,直接让交换机转发给指定的电脑(单播)。

同时,当有消息发送经过二层交换机时他的内容也会维护记录了交换机接口和连接的电脑的mac地址的对应关系,例如:
    接口(网卡)               mac地址
      接口1              14-9d-da-2a-dd-0A
      接口2              14-9d-da-2a-dd-0B
      接口3              14-9d-da-2a-dd-0C
      ...
这样一来,交换机在进行数据转发时,效率就更高了。

注意:每台电脑出厂时在网卡中都设置了唯一的mac地址(不重复),网卡集成在主板上,如果更换了主板则mac地址也会变更。

1.1.2 ルーター

複数の寮が相互に通信できるネットワークを構築したい場合、【レイヤー2スイッチ】と【エンタープライズルーター】が連携して、少し大きめのLANを構築する必要があります(ブロードキャストストーム緩和も兼ねて)。

划分好网络结构之后,其实会给各宿舍的电脑分配IP和网关,例如:
   宿舍A:
		- 电脑1:192.168.10.1  网关:192.168.10.254
		- 电脑2:192.168.10.2  网关:192.168.10.254
		- 电脑3:192.168.10.3  网关:192.168.10.254
		- 电脑4:192.168.10.4  网关:192.168.10.254
   宿舍B
		- 电脑1:192.168.20.1  网关:192.168.20.254
		- 电脑2:192.168.20.2  网关:192.168.20.254
		- 电脑3:192.168.20.3  网关:192.168.20.254
		- 电脑4:192.168.20.4  网关:192.168.20.254

然后再在路由器中配置路由表(包含网段和路由器上的接口的对应关系),例如:
	 接口             IP
     eth0   	  192.168.10.254(192.168.10网段)
     eth1   	  192.168.20.254(192.168.20网段)
    
想与外部网络通信,需要配置网关,网关就是路由表中配置的指向此网段的IP。其实就类似于贸易出口都需要经过海关。
数据通信的过程结合了APR协议和IP协议,例如:宿舍A的电脑1向宿舍B的电脑3发送消息(目标IP:192.168.20.3)。

简化过程:
	- 宿舍A的电脑1,通过广播或单播将数据发送到网管(路由器)
    - 路由器接收到数据之后,再通过对应的接口把数据通过广播的形式发送到宿舍B。
注意:各自局域网内通过学习并记录相关mac地址后,就可以不再使用广播形式,而是使用单播来发送消息了。

1.1.3 レイヤ3スイッチ

レイヤ 3 スイッチは、スイッチとルータの機能 (ほとんどのルータ機能) を統合しており、上記 3 つのデバイスは実際にレイヤ 3 スイッチで処理できます。

按照下图,在三层交换机上分别做如下几件事:

1. 划分两个vlan,模拟出来路由器的两个接口。
2. 将交换机的接口划分给指定的vlan,例如:
	接口123划分给一个vlan,相当于交换机连接上了路由器。
    接口456划分给一个vlan,相当于交换机连接上了路由器。
3. 电脑连接上交换机。
4. 进行相应的配置。
	宿舍A(左边)电脑配置:
    	- 电脑1192.168.10.1  网关:192.168.10.254	对应交换机接口:1
		- 电脑2192.168.10.2  网关:192.168.10.254	对应交换机接口:2
		- 电脑3192.168.10.3  网关:192.168.10.254	对应交换机接口:3
	宿舍B(右边)电脑配置:
		- 电脑1192.168.20.1  网关:192.168.20.254	对应交换机接口:4
		- 电脑2192.168.20.2  网关:192.168.20.254	对应交换机接口:5
		- 电脑3192.168.20.3  网关:192.168.20.254	对应交换机接口:6
	
    交换机中的路由配置:
    	  接口               IP
         左vlan   	  192.168.10.254192.168.10网段)
         右vlan   	  192.168.20.254192.168.20网段)
        
通过上述的配置之后,就可以实现宿舍A和宿舍B的网络通信了。

1.1.4 小規模企業の基本的なネットワーク アーキテクチャ

1.1.5 ホームネットワークアーキテクチャ

1.1.6 インターネット

1.2 ネットワークコア語彙

1.2.1 サブネットマスクとIP

前述したように、ネットワーク デバイスにアクセスした後、セカンダリ コンピューターを参照するために IP が必要になります (例: 192.168.10.1)。

IP は 32 ビット バイナリです。記憶しやすいように 4 つのグループに分割されており、各グループは 8 ビットであり、小数点で区切られています。次に例を示します。

二进制表示:00000000.10010111.11111111.00001111
十进制表示:251.151.255.15

0~255
192.178.11.211
192.178.11.311

ネットワーク内の各コンピュータには IP がバインドされているため、IP を通じて対応するコンピュータを見つけることができます。

IP アドレスは、ネットワーク アドレス + ホスト アドレスの 2 つの部分に分けることができます。

  • 質問 1: ネットワーク アドレスとホスト アドレスを確認するにはどうすればよいですか?

    通过子网掩码就可以确定IP的网络地址和主机地址。
    
    示例1:
        	IP:192.168.1.199      11000000.10101000.00000001.11000111
    	子网掩码:255.255.255.0     11111111.11111111.11111111.00000000
    此时,网络地址就是前24位 + 主机地址是后8位。你可能见过有些IP这样写 192.168.1.199/24,意思也是前24位是网络地址。
    
    
    示例2:
        	IP:192.168.99.254     11000000.10101000.01100011.11111110
    	子网掩码:255.255.240.0     11111111.11111111.11111100.00000000
    此时,网络地址就是前22位 + 主机地址是后10位。你可能见过有些IP这样写 192.168.99.254/22,意思也是前22位是网络地址。
    
  • 質問 2: ネットワーク アドレス + ホスト アドレスを分割する意味は何ですか?

    网络地址相同的IP,也称为属于同一个网段。
    在局域网内只有同一个网段的IP才能相互通信,不同网段IP想要通信需要借助路由的转发才能通信。
    
    当了解子网掩码之后,其实就可以确定某个网段可以容纳的主机个数,例如:
    【IP: 192.168.10.2  掩码:255.255.255.0】 和 【192.168.10.251 掩码:255.255.255.0】 数据同一个网段。
    
    	示例网段的主机范围:11000000.10101000.00001010. 00000001  ~  11000000.10101000.00001010.  11111110
    	                 --------------------------              --------------------------
    	                          网络地址                                   网络地址
    				           192.168.10.1                 ~           192.168.10.254
                               
    【IP: 192.168.8.1  掩码:255.255.240.0】 和 【192.168.11.254 掩码:255.255.240.0】 数据同一个网段。
    	子网掩码:255.255.240.0
    	示例网段的主机范围:11000000.10101000.000010 00.00000001  ~  11000000.10101000.000010 11.11111110
    	                 11111111.11111111.111111 00.00000000
    	                 ------------------------                 ------------------------
    	                          网络地址                                   网络地址
    				           192.168.8.1                 ~           192.168.11.254
    				           
    【IP: 192.168.96.1  掩码:255.255.240.0】 和 【192.168.99.254  掩码:255.255.240.0】 数据同一个网段。
    	示例网段的主机范围:11000000.10101000.011000 00.00000001  ~  11000000.10101000.011000 11.11111110
    	         
    	                 ------------------------                 ------------------------
    	                          网络地址                                   网络地址
    				           192.168.96.1                 ~           192.168.99.254    
    

1.2.2 DHCP

LAN 内のコンピュータに IP を割り当てる方法は 2 つあります。

  • 手動設定の場合は、指定したメニューバーを開き、そこに対応する IP 情報を入力します。

  • 自動取得

    - 在电脑端,IP地址获取方式设置为自动。
    - 在路由器或三层交换机,开启DHCP服务,并设置IP地址池。(家用路由器上也是基于DHCP服务自动分配的IP)
    
    这样,电脑只要连接只该网络,DHCP服务就会为它自动分配IP、子网掩码、网关。
    

1.2.3 イントラネットとパブリック IP

一般情况下,内网IP都用这些(潜规则):
	- 10.0.0.0 到 10.255.255.255
	- 172.16.0.0 到172.31.255.255
	- 192.168.0.0 到192.168.255.255

以前は、ローカル エリア ネットワーク内のコンピュータに割り当てられた IP は と呼ばれていました内网IP。イントラネット IP に基づいて、ローカル エリア ネットワーク内で相互に通信できます (関連する構成も必要です)。

インターネット経由で通信する場合は、パブリック IP を使用する必要があります。たとえば、右側の自宅のコンピューターは、左側の会社のサーバーに展開されている Web サイトにアクセスしたいと考えています。

  • ステップ 1: 左側の会社の場合、オペレータにアクセスして公衆ネットワーク上の固定 IP を申請します (オペレータは専用線ブロードバンドを処理するときに少なくとも 1 つの固定 IP アドレスを割り当てます)。実際、オペレータはバインディングを作成します。引いた専用線と固定IPの関係。(パブリックネットワークIP: 123.206.15.88を想定)
  • ステップ 2: パブリック ネットワーク IP と指定したサーバーの転送ルールを構成します。
  • ステップ 2: 右側のファミリーの場合、特定の会社サーバー上の Web サイトにアクセスしたい場合は、指定された IP: 123.206 を実行するだけで済みます。デバイスが指定されたサーバーを見つけるまで待ちます。

オペレータからネットワークにアクセスする各ユーザーが外部ネットワーク IP を持つことができるのは当然ですが、世界中のユーザーが多すぎて IP を割り当てるのに十分ではないため、オペレータ ネットワークは複数のネットワークに分割されて共有されます。ホーム ブロードバンド ユーザー パブリック ネットワーク IP (動的、パブリック ネットワーク IP はオンラインになるたびに異なる場合があります)。

ホーム ユーザーがネットワーク経由で他の IP にアクセスしたい場合、その情報はまずオペレーターに送信され、オペレーターはそれを他の IP に転送します。

注: 外部ユーザーが家庭用ブロードバンドの IP にアクセスしたい場合、オペレーターはリクエストを当社のコンピューターに転送しません。

したがって、将来世界中のユーザーがアクセスできる Web サイトを開発したい場合は、次のことを行う必要があります。

  • 専用線を引いて公衆網の固定IPを申請する
  • サーバー (つまり、パフォーマンスの良いコンピューター) を購入する
  • パブリック IP はこのサーバーにバインドされています
  • 書いたコードをサーバーに置いて実行する

これでうまくいきます...

拡張子: IPv4 および IPv6

IPv4,长度为 32 位(4 个字节), 格式:A.B.C.D
IPv6,长度为 128 位(16 个字节),用":"分成8段,格式:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX(每个X是一个16进制数)。

1.2.4 クラウドサーバー

Alibaba Cloud、Tencent Cloud、Amazon AWS などのプラットフォームはすべてクラウド サーバーに関与している、ということを以前に聞いたことがあるかもしれません。

簡単に言うと、コンピューター室 (インターネット カフェ) を建て、サーバー (高性能コンピューター) を大量に購入し、コンピューター室に置き、主にこれらのサーバー リソースを借りるために電源を入れてインターネットに接続しました。これにより、ユーザーは独自の専用回線を引いたり、ネットワークを構成したり、サーバーを購入したりする必要がなくなります。

Tencent Cloud でサーバーをレンタルする場合、必要に応じて構成を選択できます。Tencent Cloud は構成に従って物理マシン上のサーバーを仮想化し、対応する環境を初期化してパブリック ネットワークにバインドします。 . IP を使用すると、誰でもアクセスできるサーバーをすぐに構築できます。

注: 非常に高性能な物理マシンは、vmware、並列などを使用して自分のコンピュータ上に複数の仮想マシンを作成するのと同様に、多くの仮想マシンを仮想化します。

1.2.5 ポート

Tencent からクラウド サーバー (エクストラネット IP: 123.206.15.88) をレンタルし、そのサーバー上で実行する 2 つの Web サイトを開発するとします。

そこで問題は、ユーザーが自分のコンピュータまたは携帯電話で同じサーバー上の 2 つのプログラムにどのようにアクセスできるかということです。

実際、コンピュータには概念があり端口、ネットワーク経由で通信するすべてのプログラムは、次のようにポートを指定する必要があります。

  • Web サイト A: ポート 8001 を使用すると、ユーザーはコンピューターまたは携帯電話でアクセスするときに次のように IP とポートを指定できます。123.206.15.88:8001
  • Web サイト B: ポート 8002 を使用すると、ユーザーは次のようにコンピューターまたは携帯電話でアクセスするときに IP とポートを指定できます。123.206.15.88:8002

注: ポートの値の範囲: 0 ~ 65535。コンピュータ内部では多くのポートが使用されています。通常、カスタマイズする場合は 5000 以降のポートを選択しようとします。

例: Baidu にアクセス

ヒント: ブラウザに IP のみを書き込み、ポートを書き込まない場合、デフォルトはポート 80 です。

1.2.6 ドメイン名

123.206.15.88:80仮にあなたが起業してWebサイトを開発したとすると、パブリックIP 「123.206.15.88」をユーザーが覚えておくのは困難です。

したがって、ドメイン名が誕生し、ドメイン名と IP に対応する関係が作成されます。ユーザーはドメイン名を覚えるだけで済みます。次に例を示します。

www.baidu.com   -->  110.242.68.3
www.taobao.com  --> 121.18.239.232
...

注: ドメイン名は IP との対応関係を確立するだけであり、ポートとは何の関係もありませんwww.baidu.com:80

ユーザーがコンピュータまたは携帯電話にドメイン名を入力してアクセスする場合、実際には次の 2 つの手順を実行する必要があります。

  • ドメイン名に基づいて IP を検索します。(IPを探してください)
  • IPを取得したら、そのIPを使用して指定されたサーバーにアクセスします。

コンピューター上のドメイン名に属した後、IP を見つけるプロセスは次のとおりです。

  • ステップ 1: コンピュータの DNS キャッシュ レコードでドメイン名に対応する IP を見つけます。見つからない場合は、次のステップに進みます。

  • ステップ 2: コンピュータの hosts ファイルを検索します。見つからない場合は、次のステップに進みます。

    - mac系统:/etc/hosts 文件中
    - win系统:C:\Windows\System32\drivers\etc\hosts 文件中
    
    # 内容示例
    127.0.0.1	localhost
    255.255.255.255	broadcasthost
    127.0.0.1 kubernetes.docker.internal
    192.168.1.55 www.pythonav.com
    
  • ステップ 3: コンピュータ上の DNS 構成 (ローカル ドメイン ネーム サーバー) のアドレスを見つけ、このアドレスに移動してドメイン名に対応する IP を見つけます。見つからない場合は、次のステップに進みます。

常见的DNS服务器地址:
	114.114.114.114114 DNS)
    223.5.5.5(阿里 AliDNS)
    8.8.8.8(Google DNS,随着Google在中国的没落和国内官方的限制,已经不是太好用了)
    ...
    各大运营商也有相应的DNS服务器...
    
如果你选择的是自动获得DNS,那么就会使用本地运营商的DNS服务器了。
  • ステップ 4: ルート ドメイン ネーム サーバーにアクセスして問い合わせます (ルート ドメイン ネーム サーバーは世界中に 13 個あり、中国に最も近いのは日本にあります)

ここで問題が発生します

ドメイン名で何が起こっているかを理解した後は? では、ドメイン名を使用して Web サイトにアクセスしたい場合は、どうすればよいでしょうか? 【現時点で理解している内容】

  • ドメイン名を借りる

    ICANN,域名的总管理者(美国一个非营利机构),它仅制定域名政策,注册业务它会授权给一些顶级注册商。
    顶级注册商,可以对外销售域名,但要受国家 互联网络信息中心的管理。例如:中国万网(阿里云收购),中国新网,新网互联,商务中国,中国频道等。
    代理注册商,顶级注册上可以再招一些代理帮助他们卖域名。
    
  • 記録

    现在国内注册域名后,需要进行备案(提交一些网站、个人或企业 等信息)后才能使用。
    注册成功后,可按照引导备案:https://beian.aliyun.com/
    
    注意:国外的域名无需备案就能使用。
    
  • DNS

    让域名和IP创建关联关系,并将关系同步到相关:本地域名服务器 和 根域名服务器(含顶级和二级域名服务器)。
    

2. ネットワークプログラミング

Python にはソケット モジュールが組み込まれており、ネットワーク間でデータを迅速に送信できます。例えば:

  • サーバーは左側のクラウドサーバーに配置されています(固定IP)
import socket

# 1.监听本机的IP和端口
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('123.206.15.88', 8001)) # IP,端口
sock.listen(5) # 支持排队等待5人

while True:
    # 2.等待,有人来连接(阻塞)
    conn, addr = sock.accept() # 等待客户端来连接(阻塞)

    # 3.等待,连接者发送消息(阻塞)
    client_data = conn.recv(1024) # 等待接收客户端发来数据
    print(client_data.decode('utf-8')) # 字节

    # 4.给连接者回复消息
    conn.sendall("hello world".encode('utf-8'))

    # 5.关闭连接
    conn.close()

# 6.停止服务端程序
sock.close()
  • クライアント
import socket

# 1. 向指定IP发送连接请求
client = socket.socket()
client.connect(('123.206.15.88', 8001)) # 向服务端发起连接(阻塞)10s

# 2. 连接成功之后,发送消息
client.sendall('hello'.encode('utf-8'))

# 3. 等待,消息的回复(阻塞)
reply = client.recv(1024)
print(reply)

# 4. 关闭连接
client.close()

上記の例ではインターネットの助けが必要であり、通信するには少なくとも 1 つのクラウド サーバーをレンタルする必要があります。

学習コストを節約するために、[サーバー]と[クライアント]をコンピューター上でシミュレーションし、プロジェクトの開発が完了した後、サーバーをレンタルしてサーバーにデプロイすることができます。

注: 上記のコードをローカルで実行する場合は、IP アドレスを監視して接続する必要があります。

もちろん、ローカル エリア ネットワーク内に 2 台のコンピュータ (A がサーバー、B がクライアント) があり、これら 2 台が通信できるようにすることもできます。

服务端的代码需修改:监听的IP修改为A的IP地址。
客户端的代码需修改:连接的IP修改为A的IP地址(客户端要去找到服务端,并与服务端创建连接)。

予防:

  • このマシン:

    服务端IP:127.0.0.1  / 192.168.28.92(局域网IP)
    
  • ローカルエリアネットワーク:

    服务端IP:192.168.28.92(局域网IP)    
    
  • インターネット

    服务端IP:123.206.15.88(外网IP)
    

事例:知的障害のあるお客様対応

  • サーバ
import socket
# 1.监听本机的IP和端口
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('127.0.0.1', 8001))  # 127.0.0.1 或 查看自己局域网本地IP地址
sock.listen(5)

while True:
    # 2.等待,有人来连接(阻塞)
    conn, addr = sock.accept()
    print("有人来连接了...")

    # 3.连接成功后立即发送
    conn.sendall("欢迎使用xx系统,请输入您想要办理的业务!".encode("utf-8"))

    while True:
        # 3.等待接受信息
        data = conn.recv(1024)
        if not data:
            break
        data_string = data.decode("utf-8")

        # 4.回复消息
        conn.sendall("你说啥?".encode("utf-8"))
    print("断开连接了")
    # 5.关闭与此人的连接
    conn.close()

# 6.停止服务端程序
sock.close()

  • クライアント
import socket

# 1. 向指定IP发送连接请求
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 8001))

# 2.连接成功后,获取系统登录信息
message = client.recv(1024)
print(message.decode("utf-8"))

while True:
    content = input("请输入(q/Q退出):")
    if content.upper() == 'Q':
        break
    client.sendall(content.encode("utf-8"))

    # 3. 等待,消息的回复
    reply = client.recv(1024)
    print(reply.decode("utf-8"))

# 关闭连接,关闭连接时会向服务端发送空数据。
client.close()

ケース: ファイルのアップロード

  • サーバ
import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('127.0.0.1', 8001))  # 127.0.0.1 或 查看自己局域网本地IP地址
sock.listen(5)

conn, addr = sock.accept()

# 接收文件大小
data = conn.recv(1024)
total_file_size = int(data.decode('utf-8'))

# 接收文件内容
file_object = open('xxx.png', mode='wb')
recv_size = 0
while True:
    # 每次最多接收1024字节
    data = conn.recv(1024)
    file_object.write(data)
    file_object.flush()

    recv_size += len(data)
    # 上传完成
    if recv_size == total_file_size:
        break

# 接收完毕,关闭连接
conn.close()
sock.close()
  • クライアント
import time
import os
import socket

client = socket.socket()
client.connect(('127.0.0.1', 8001))

file_path = input("请输入要上传的文件:")

# 先发送文件大小
file_size = os.stat(file_path).st_size
client.sendall(str(file_size).encode('utf-8'))

print("准备...")
time.sleep(2)
print("开始上传..")
file_object = open(file_path, mode='rb')
read_size = 0
while True:
    chunk = file_object.read(1024) # 每次读取1024字节
    client.sendall(chunk)
    read_size += len(chunk)
    if read_size == file_size:
        break

client.close()

3. B/S および C/S アーキテクチャ

開発したり、人々とコミュニケーションしたりするときに、b/s アーキテクチャと c/s アーキテクチャについてよく言及されますが、これは何を意味するのでしょうか?

  • C/Sアーキテクチャとは、Client and Serverの略称です。このアーキテクチャでプログラムを開発するということは、クライアントとサーバーの両方を開発する必要があることを意味します。

    例如:你电脑的上QQ、百度网盘、钉钉、QQ音乐 等安装在电脑上的软件。
    
    服务端:互联网公司会开发一个程序放在他们的服务器上,用于给客户端提供数据支持。
    客户端:大家在电脑安装的相关程序,内部会连接服务端进行收发数据并提供 交互和展示的功能。
    
  • B/Sアーキテクチャとは、Browser and Serverの略称です。このアーキテクチャでプログラムを開発すると、サーバーのみを開発する必要があり、クライアントはユーザーのコンピューター上のブラウザーに置き換えられます。

    例如:淘宝、京东等网站。
    
    服务端:互联网公司开发一个网站,放在他们的服务器上。
    客户端:不需要开发,用现成的浏览器即可。
    

つまり、B/S アーキテクチャは Web サイトを開発するものであり、C/S アーキテクチャはコンピュータにインストールされるソフトウェアを開発するものです。

要約する

  1. 一般的なデバイスとネットワーク アーキテクチャについて学びます。
  2. 一般的なオンライン語彙の意味を理解します。
  3. B/S アーキテクチャと C/S アーキテクチャの違いを理解します。
  4. Pythonのソケットモジュールをベースにしたネットワークプログラミング。

Guess you like

Origin blog.csdn.net/qq_37049812/article/details/119721590