傳輸模型和套接字

2022-07-13 16:15:11 字數 3658 閱讀 9735

基本模型:

osi七層模型

先有模型,再有協議

tcp建立連線:三次握手

怎麼連線的?為什麼要三次?

客戶端:我要連線你

服務端:好的,我準備好了

客戶端:我建立連線了

三次保證同步,例如因為網路延遲導致兩邊收到訊息延後,發出的報文就可能收不到或者不知道是誰的。

資料傳輸

斷開連線:四次揮手

客戶端:我要關閉連線了

服務端:好的,等一下

服務端:我的資料都給你了,我要斷開了

客戶端:好的,我斷開了

為什麼多了一次:

因為服務端可能還資料要發

到底是一次連線傳一次資料

還是一次連線傳多次資料

都可以http協議 前著 請求一次,響應一次

websocket 後者 服務端有新的訊息就會發給建立連線的客戶端

不同主機之間通訊,先用ip確定某個主機,再用埠確定某乙個應用程式。

除了一些服務占用的埠外,其他埠由作業系統分配,總共65535埠

127.0.0.1 自己的主機位址

0.0.0.0 任意的主機位址

fd:正整型資料,檔案描述符(唯一標識了乙個socket)

domain:(域)

af_inet     ipv4

af_inet6    ipv6

type:(套接字型別):

sock_raw     原始套接字    ——>使用原始套接字時候呼叫,原始套接字也就是鏈路層協議

sock_stream   位元組流套接字   ——>提供順序,可靠,雙向,基於連線的位元組流。 可以支援帶外資料傳輸機制。例如:tcp協議、ftp協議

sock_dgram 資料報套接字   ——>支援資料報(無連線,不可靠的固定最大長度的訊息)例如:udp協議

sock_seqpacket 有序分組套接字 ——>為固定最大長度的資料報提供有序,可靠,雙向連線的資料傳輸路徑; 消費者需要利用每個輸入系統呼叫讀取整個分組

protocol(協議):

ipproto_ip     ip傳輸協議

ipproto_tcp    tcp傳輸協議

ipproto_udp   udp協議

ipproto_sctp   sctp傳輸協議

ipproto_icmp icmp協議

ipproto_igmp   igmp協議

一般情況下ipproto_tcp、ipproto_udp、ipproto_icmp協議用的最多,udp協議protocol就取ipproto_udp,tcp協議protocol就取ipproto_tcp;一般情況下,我們讓protocol等於0就可以,系統會給它預設的協議。但是要是使用raw socket協議,protocol就不能簡單設為0,要與type引數匹配.

三種套接字

服務端套接字:

1、監聽套接字(相當於前台,把你分配給連線套接字之後,繼續監聽。如果一次連線過多,處理不過來的會掛起)

2、連線套接字(相當於和你交流的人)

客戶端套接字

服務端的埠不能由作業系統分配(一般是固定的,讓客戶端知道要請求哪個埠)

服務端套接字的繫結和監聽

sock.bind(('',8888)) #

服務端套接字繫結自己的ip位址與埠號,客戶端那邊可以不寫,核心會給它分配乙個臨時的埠.不寫就是繫結到本地,後面8888是埠

sock

=724, family=addressfamily.af_inet, type=socketkind.sock_stream, proto=0, laddr=('0.0.0.0', 9999)>sock.listen(5) #

開始監聽,5表示最大掛起數

客戶端套接字

client =socket.socket()

client.connect(('127.0.0.1',9999))

client

=872, family=addressfamily.af_inet, type=socketkind.sock_stream, proto=0, laddr=('127.0.0.1', 58311), raddr=('127.0.0.1', 9999)>

laddr表示本地位址,raddr表示遠端連線的位址

對於客戶端來說 laddr是客戶端ip + 作業系統分配的任意埠,raddr是服務端的ip+繫結的埠

對於服務端來說 laddr是服務端的ip + 繫結的埠,raddr是客戶端的ip+客戶端系統分配的埠

t = sock.accept() #

例項乙個對等連線套接字,用來和客戶端通訊。如果沒有客戶端連線,會處於阻塞狀態

t(=676, family=addressfamily.af_inet, type=socketkind.sock_stream, proto=0, laddr=('127.0.0.1', 9999), raddr=('127.0.0.1', 58311)>,

('127.0.0.1', 58311))

conn, addr = t #

conn現在是連線套接字,addr是客戶端位址和埠

client.send(b'hello') #

客戶端傳送訊息(位元組型別,如果是字串記得要encode),返回資料長度.客戶端斷開連線之後,會傳送乙個b''空位元組

conn.recv(1024) #

連線套接字接收訊息,1024表示每次最大接收資料大小,可以通過迴圈把所有資料接受完,接收的訊息是位元組型別,記得decode。如果沒有資料發過來,會處於阻塞狀態

client.close() #

客戶端程式執行完會自己斷開

conn.close() #

服務端可以根據是否接到空,判斷是否需要斷開

傳輸模型與套接字

1.概念 tcp ip模型 tcp ip協議不是tcp和ip兩個協議的合稱,而是指網際網路整個tcp ip協議族 2.模型對比 osi七層模型 tcp ip 應用層 應用層 表示層 會話層傳輸層 終端裝置 傳輸層 網路層 路由器 網路層 資料鏈路層 交換機 網路介面層 物理層 網絡卡,網線等1.概念...

套接字i o模型

當套接字建立時,預設情況下是工作在阻塞模式。在阻塞模式下,執行i o的winsock呼叫 如send 和recv 一直到操作完成時才返回。比如呼叫recv 函式,如果對應的緩衝區沒有資料到來。呼叫者將會一直等待下去,直到有資料到達為止。1 阻塞 blocking 模型 對於以下函式呼叫 int ir...

套接字I O模型

在unix下可用的5種i o模型為 柱塞i o模型 非柱塞i o模型 i o復用 select和poll 訊號驅動式i o sigio 非同步i o 柱塞式i o模型 最流行的i o模型是柱塞式i o模型,預設情況下所有套接字都是用柱塞的,以資料報套接字為例子,如圖 程序呼叫recvfrom,其系統...