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協議
面向連接 ,是一種可靠的數據傳輸
三次握手
- 客戶端向服務器發起連接請求(問是否可以連接)
- 服務器接收到請求后進行確認(允許連接)返回報文
- 客戶端收到許可,建立連接
四次揮手
- 主動方發送報文告知被動方要斷開連接
- 被動方返回報文,告知受到請求,准備斷開
- 被動方發送報文給主動方告知准備就緒可以斷開
- 主動方發送報文確定斷開
可靠傳輸 : 無失序 無差錯 無丟失 無重復
應用情況 : 適用於傳輸內容較大,網絡情況好,需要提供准確傳輸的情況
比如 : 聊天信息 ,文件傳輸,郵件
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. 讓套接字具有監聽功能
s
ockfd.listen(n)
功能 : 使套接字變為監聽套接字,同時創建監聽隊列
參數 : n 監聽隊列大小
4. 等待客戶端連接
sockfd.accept()
功能 : 阻塞等待客戶端連接
返回值 : 第一個:返回一個新的套接字用來和客戶端通信
第二個:返回連接的客戶端的地址
5. 消息的收發
recv(buffer)
功能 : 接收消息
參數 : 一次接收消息的大小 字節
返回值: 接收到的內容
send(data)
功能: 發送消息
參數: 發送的內容 (byte)
返回值 : 發送了多少個字節
- 當沒有接收端的時候send操作會導致 broken pipe
6. 關閉套接字
close()
功能 : 關閉套接字
tcp客戶端流程
- 1.創建流式套接字
- 2.發起連接請求
connect()
功能:發起連接
參數 : 一個元組 第一個元素 : 服務器的IP
第二個元素 : 服務器的port
- 3.收發消息
- 4.關閉套接字