網絡編程(一)

網絡---》進程線程---》web服務器
mongo ---》 regex --》 項目

互聯網 --》 網絡傳輸數據

ISO(國際標準化組織)---》網絡體系結構標準 OSI模型

OSI 七層模型

應用層 :提供用戶服務,具體內容由特定程序規定

表示層 :提供數據的壓縮解壓和加密等

會話層 :創建程序級的鏈接,決定使用什麼樣的傳輸服務

傳輸層 :提供合適的通訊服務,流量控制

網絡層 : 路由選擇,網絡互聯,分組傳輸

鏈路層 : 提供鏈路交換,具體消息發送

物理層 : 物理硬件,接口

OSI 模型優勢 : 將功能分開,下降網路傳輸中的耦合度,每一部分完成本身的功能,開發更加清晰。

高內聚 :使模塊功能單一,不混雜。
低耦合 :模塊之間儘可能減小相互的關聯和影響

四層、五層模型

四層模型
應用層 : 應用層 表示層 會話層
傳輸層 : 傳輸層
網絡層 : 網絡層
物理鏈路層 : 鏈路層 物理層

五層模型(TCP/IP模型)
應用層 : 應用層 表示層 會話層
傳輸層 : 傳輸層
網絡層 : 網絡層
鏈路層 : 鏈路層
物理層 :物理層

要求 : 可以順序說出七層模型,知道如何對應四層五層模型,簡單理解每一層的功能,能理解數據傳輸過程


什麼是協議

網絡協議 : 網絡通訊中,各方必須遵照的規定,包括創建什麼鏈接,如何識別,消息結構等

應用層: TFTP HTTP SMTP DNS

傳出層: TCP UDP

網絡層: IP


網絡概念

主機 : 計算機的名稱
localhost

獲取主機名
In [3]: socket.gethostname()
Out[3]: 'tedu'

經過主機名解析IP
In [4]: socket.gethostbyname('tedu')
Out[4]: '127.0.1.1'

In [5]: socket.gethostbyname('localhost')
Out[5]: '127.0.0.1'

IP

IPv4 : 192.168.1.2
點分是十進制:三個點分爲四個部分,0--255

IPv6 : ip地址更多

127.0.0.1 : 本地測試ip
0.0.0.0 : 局域網可用IP
192.168.1.0 : 表示網段
192.168.1.1 : 網關
192.168.1.255 : 廣播地址
2---254

ifconfig ping

In [6]: socket.gethostbyaddr('www.baidu.com')
Out[6]: ('127.0.0.1', [], ['119.75.216.20'])
主機名 別名 IP

將IP地址轉換爲二進制
In [7]: socket.inet_aton('192.168.1.2')
Out[7]: b'\xc0\xa8\x01\x02'

將二進制轉換爲點分十進制
In [8]: socket.inet_ntoa(b'\xc0\xa8\x01\x02')
Out[8]: '192.168.1.2'

inet_pton inet_ntop 功能同上,只是第一個參數用
socket.AF_IENT表示IPv4 socket.AF_INET6--->IPv6

端口號
端口號是地址的組成部分,在一個系統中區分應用層程序
1--65535 : 1--255 衆所周知的端口 256---1023 系統端口
>10000 6666 7777 8888 9999

獲取一個應用的端口
In [11]: socket.getservbyname('mysql')
Out[11]: 3306


子網掩碼:和IP配合過濾網段
dns:域名解析

字節序

大端序:高字節存在低地址

小端序:低字節存在低地址

網絡字節序 : 將字節序發送方式統一


傳輸層服務

tcp協議

面向鏈接 ----》 可靠的數據傳輸

三次握手
1.客戶端向服務器發起鏈接請求(問是否能夠鏈接)
2.服務器接收到請求後進行確認(容許鏈接)返回報文
3.客戶端收到許可,創建鏈接

四次揮手
1.主動方發送報文告知被動方要斷開鏈接
2.被動方返回報文,告知受到請求,準備斷開
3.被動方發送報文給主動方告知準備就緒能夠斷開
4.主動方發送報文肯定斷開

可靠傳輸 : 無失序 無差錯 無丟失 無重複

應用狀況 : 適用於傳輸內容較大,網絡狀況好,須要提供準確傳輸的狀況
好比 : 聊天信息 ,文件傳輸,郵件


udp協議
面向無鏈接的服務 ----》 不可靠

發送時由發送端自主進行,不考慮接收端

適用狀況 : 網絡較差,對傳輸準確性要求低,廣播組播
好比 : 視頻會議, 廣播數據


套接字編程

套接字: 進行網絡通訊的一種手段 socket

流式套接字(SOCK_STREAM) :傳輸層基於tcp協議進行通訊

數據報套接字(SOCK_DGRAM) :傳輸層基於udp協議進行通訊

原始套接字(SOCK_RAW): 訪問底層協議的套接字


TCP 服務端
from socket import *

1. 建立套接字
socket(socket_family=AF_INET,
socket_type=SOCK_STREAM,
proto = 0)
功能 : 建立套接字
參數 : socket_family:選擇地址族種類 AF_INET (UNIX)
socket_type : 套接字類型SOCK_STREAM 流式
SOCK_DGRAM 數據報
proto :子協議類型默認爲0
返回值 : 返回建立的套接字

2. 綁定 IP 和端口號

sockfd.bind()
功能 : 綁定IP和端口
參數 : 是一個元組 ,第一項是字符串形式的IP
第二項是端口號
(‘192.168.1.2’,8888)

3. 讓套接字具備監聽功能
sockfd.listen(n)
功能 : 使套接字變爲監聽套接字,同時建立監聽隊列
參數 : n 監聽隊列大小

4. 等待客戶端鏈接
sockfd.accept()
功能 : 阻塞等待客戶端鏈接
返回值 : 第一個:返回一個新的套接字用來和客戶端通訊
第二個:返回鏈接的客戶端的地址

5. 消息的收發
recv(buffer)
功能 : 接收消息
參數 : 一次接收消息的大小 字節
返回值: 接收到的內容

send(data)
功能: 發送消息
參數: 發送的內容 (byte)
返回值 : 發送了多少個字節

* 當沒有接收端的時候send操做會致使 broken pipe

6. 關閉套接字
close()
功能 : 關閉套接字
****************************************
建立一個tcp服務端
from socket import *

sockfd = socket(AF_INET,SOCK_STREAM,0)
sockfd.bind(('127.0.0.1',8888))
sockfd.listen(5)
while True:
print("waiting for connect....")
connfd,addr = sockfd.accept()
print("connect from",addr)
while True:
data = connfd.recv(1024)
if not data:
break
print(data.decode())
connfd.send('來,確認下眼神'.encode())
connfd.close()
sockfd.close()
****************************************

tcp客戶端流程

1.建立流式套接字
2.發起鏈接請求
connect()
功能:發起鏈接
參數 : 一個元組 第一個元素 : 服務器的IP
第二個元素 : 服務器的port

3.收發消息
4.關閉套接字
********************************************
建立一個tcp客戶端
from socket import *

sockfd = socket(AF_INET,SOCK_STREAM)
sockfd.connect(('127.0.0.1',8888))

while True:
msg = input("發消息>>")
sockfd.send(msg.encode())
if not msg:
break
data = sockfd.recv(1024)
print(data.decode())
sockfd.close()
********************************************

**** 如何讓一個服務器處理多個客戶端任務 ****

練習
1. 什麼是網絡七層模型,每一層什麼功能。tcp/ip模型又是什麼
2. 簡述三次握手和四次揮手的過程
3. 使用tcp完成一個簡單的對話交互
相關文章
相關標籤/搜索