網路收發緩衝區,基於udp的通訊,udp套接字應用之廣播
recv()特徵
1. 如果連線端斷開,recv會立即結束阻塞返回空字串
2. 當接收緩衝區為空時會阻塞
3. 如果recv一次接受不完緩衝區內容,下次會繼續接收,確保資料不丟失
send()特性
1.如果另一端不存在還試圖使用send進行傳送則會產生BrokenPipeError異常
2.當傳送緩衝區滿時會阻塞
sendall(data)
功能::TCP套接字傳送訊息
網路收發緩衝區
*緩衝區的功能 : 協調讀寫速度,減少和磁碟互動
recv和send實際上是從緩衝區內獲取內容,和向緩衝區傳送內容
tcp粘包
產生原因:tcp傳輸採用位元組流的方式,訊息之間沒有邊界,如果傳送和接受速度不匹配,會造成多次傳送的內容被一次接受,形成意義上的誤解即粘包
產生條件 : 當使用send快速的連續傳送極有可能產生粘包。
影響: 如果每次傳送的內容代表一個獨立的意思,此時產生粘包需要處理。但是如果多次傳送的內容本身就是一個連續的整體,此時就不需要處理。
如何處理 :
1. 每次傳送後加一個結尾標誌,接收端通過標誌進行判斷
2. 傳送一個數據結構
3. 每次傳送中間有一個短暫的延遲
基於udp的通訊
服務端
1. 建立套接字 ---》 資料報套接字
sockfd = socket(AF_INET,SOCK_DGRAM)
2. 繫結服務端地址
sockfd.bind()
3. 訊息的收發
data,addr = recvfrom(buffersize)
功能 : 接受udp訊息
引數 : 每次最多接收訊息的大小
返回值 : data 接收到的訊息
addr 訊息傳送者的地址
sockfd.sendto(data,addr)
功能: udp傳送訊息
引數: data要傳送的訊息 bytes
addr 目標地址
返回值 : 傳送的位元組
4.關閉套接字
sockfd.close()
cookie ,
sys.argv
功能 : 獲取來自命令列的引數,形成一個列表
* 以空格作為每一項分隔,如果一項中有空格則用引號表示一個整體
* 命令列內容均作為字串傳入
udp客戶端
1. 建立套接字
2. 訊息收發
3. 關閉套接字
tcp流式套接字 和 udp資料報套接字 區別
1. 流式套接字採用位元組流的方式傳輸資料,而資料報套 接字以資料報形式傳輸
2. tcp會產生粘包現象,udp訊息是有邊界的不會粘包
3. tcp傳輸是建立在連線的基礎上,保證傳輸的可靠性 ,而udp一次接受一個數據報,不保證完整性
4. tcp需要依賴listen accept建立連線,udp不用
5. tcp 收發訊息使用recv send udp用recvfrom sendto
補充:
sendall()
功能 : 同send() 作為tcp訊息傳送
引數 : 同send()
返回值 : 傳送成功返回None ,傳送失敗返回異常
socket模組和套接字屬性
(s表示一個套接字物件)
s.type : 獲取套接字型別
s.family : 獲取地址族型別
s.fileno()
功能 : 獲取套接字的檔案描述符
檔案描述符 :每一個IO作業系統都會為其分配一個不同 的正整數,該正整數即為此IO操作的檔案描述符。
s.getsockname()
功能 : 獲取套接字繫結地址
s.getpeername()
功能 : 獲取連線套接字另一端的地址
s.setsockopt(level,optname,value)
功能:設定套接字選項 豐富修改原有套接字功能
引數: level : 獲取選項的型別
optname : 每個選項型別中的子選項
value : 為選項設定值
s.getsockopt(level,optname)
功能 : 獲取套接字選項的值
udp套接字應用之廣播
一點發送多點接收
目標地址 : 廣播地址,每個網段內最大的地址
172.60.50.255 ----》 <broadcast>
cookie
format()
功能:合成字串
tcp應用之HTTP傳輸
http協議 ---》 超文字傳輸協議 應用層協議
用途 : 網頁的獲取,基於網站的資料傳輸
基於http協議的資料傳輸
特點:
1. 應用層協議,傳輸層使用tcp傳輸
2. 簡單靈活,和多種語言對接方便
3. 無狀態協議,不記錄使用者的通訊內容
4. 成熟穩定 http1.1
工作模式 :
* 使用http雙方均遵循http協議規定傳送接收訊息體
* 請求方,根據協議組織請求內容傳送給對方
* 服務方,收到內容按照協議解析
* 服務方,將回復內容按照協議組織傳送給請求方
* 請求方,收到回覆根據協議解析
http請求
http響應