網絡---》進程線程---》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完成一個簡單的對話交互