二、網路通訊的基本概念
1、tcp和udp的區別
tcp:傳輸控制協議,面向連線的服務(打**),安全、可靠(三次握手、響應+重傳、四次揮手),速度相對較慢,一般應用在對安全性、完整性有嚴格要求的場景:ftp、smtp、http。
三次握手:
a要知道,a能到b,b也能到a。
b要也要知道,a能到b,b也能到a。
a 你聽的到嗎-> b (此b知道了a能到b)
(a能到b且b能到a)a <-我能聽到,你呢 b
a 我也能聽到-> b (此b知道了b也能到a)
四手揮手:
目的是保證關閉前傳送完所有資料報(應用層已經交給底層了,位底還沒有完全傳送出去)。
a 傳送關閉請求-> b
a <-傳送請求響應 b
b檢查是否有末傳送完成的資料
<-可以關閉 b
a 傳送關閉訊息-> b
2、訊息流
應用層->表示層->會話層->網路層->傳輸層->資料鏈路層->物理層->物理層->資料鏈路層->傳輸層->網路層->會話層->表示層->應用層。
3、訊息包
當socket收到乙個要送的資料時,發先資料進行拆分成bit流,然後再組成(防丟失)資料報(可能會丟包)。
三、套接字
socket是一種介面機制,可以讓程式無論使用什麼埠、協議,都可以從socket進出資料,它負責了程序與協議之間的連線。
1、程式設計模型
點對點(p2p):一對一通訊。
客戶機/伺服器(c/s):一對多通訊。
2、建立socket
#include
#include
int socket(int domain, int type, int protocol);
功能:建立socket描述符,可以把socket當作檔案來看待,傳送資料就是寫檔案,接收資料就是讀檔案。
domain:位址型別
af_unix/af_local/af_file 本地通訊(程序間通訊)。
af_inet 基本32位ip位址通訊,ipv4
af_inet6 基本128位ip位址通訊,ipv6
type:通訊協議
sock_stream 資料流協議,tcp
sock_dgram 資料報協議,udp
protocol:特別通訊協議,給0即可。
返回值:socket描述符,類似檔案描述符。
3、通訊位址
注意:函式介面定義的是sockaddr,而實際提供的是sockaddr_un或sockaddr_in
struct sockaddr
struct sockaddr_un
; struct sockaddr_in
struct in_addr
;4、繫結
socket描述符與物理通訊載體(網絡卡或socket檔案)繫結在一起。
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
sockfd:socket描述符:socket函式的返回值
5、連線
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
sockfd:socket描述符
返回值:在不同的程式設計模型下返回值意義不同,在本地通訊
返回加0,失敗返回-1。
6、資料接收與傳送:read/write
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
recv/send與read/write功能一樣,flags多了是否阻塞的功能(0阻塞,1不阻塞)。
7、關閉套接字:close
如果是網路通訊,埠號並不會立即**,大概會占用3分鐘左右。
8、位元組序轉換
uint32_t htonl(uint32_t hostlong);
功能:把32位本機位元組序轉換成32位的網路位元組序
uint16_t htons(uint16_t hostshort);
功能:把16位本機位元組序轉換成16位的網路位元組序
uint32_t ntohl(uint32_t netlong);
功能:把32位的網路位元組序轉換成32位的本機位元組序
uint16_t ntohs(uint16_t netshort);
功能:把16位的網路位元組序轉換成16位的本機位元組序
9、ip位址轉換
int inet_aton(const char *cp, struct in_addr *inp)
in_addr_t inet_addr(const char *cp);
char *inet_ntoa(struct in_addr in);
10、本地通訊程式設計模型
程序a 程序b
建立套接字(af_local) 建立套接字(af_local)
準備位址(sockaddr_un) 準備位址(sockaddr_un)
繫結(自己的socket/位址) 連線(connect,連線程序a的位址)。
接收資料 傳送資料
關閉套接字 關閉套接字
47.97.229.46
四、基於tcp協議的c/s模型
int listen(int sockfd, int backlog);
功能:設定等待連線的最大數量
sockfd:被監聽的socket描述符
backlog:等待連線的最大數量(排隊的數量)
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:等待連線sockfd連線
addr:獲取連線的位址
addrlen:設定連線位址結構體的長度
返回值:專門用於通訊的描述符
程式設計模型:
server client
建立socket套接字 建立socket套接字
準備位址(sockaddr_in,本機位址) 準備位址(伺服器位址)
繫結(bind) …
監聽(listen) …
等待連線(accept、fork) 連線(connect)
接收請求(read/recv) 傳送請求(write/send)
響應請求(write/send) 接收響應(read/recv)
關閉(close) 關閉
網路通訊基礎知識
tcp ip的分層模型 osi協議參考模型,它是基於國際標準化組織 iso 的建議發展起來的,它分為7個層次 應用層 表示層 會話層 傳輸層 網路層 資料鏈路層及物理層。這個7層的協議模型雖然規定得非常細緻和完善,但在實際中卻得不到廣泛的應用,其重要的原因之一就在於它過於複雜。但它仍是此後很多協議模...
網路通訊基礎知識4
1 dhcp dynamic host configuration protocl,動態主機配置協議 1 每台計算機都需要乙個ip位址,且區域網內各電腦ip位址不能重複,否則就會位址衝突。2 計算機的ip位址可以是靜態設定,也可以是動態分配 3 動態分配是區域網內的dhcp伺服器來協調的,很多裝置都...
linux 系統程式設計 網路通訊基礎知識 (十)
協議就是一種提前約定好的規則。b s模式 瀏覽器 伺服器模式 tcp ip模型 網路層使用ip協議,傳輸層使用tcp udp協議,應用層使用http ssh ftp 藍芽等協議。在實際程式設計的時候,真正打交道的是應用層,至於其他層是依靠作業系統來幫助我們進行通訊。我們說的使用tcp ip協議,並不...