計算機網絡(套接字及TCP/UDP傳輸)學習心得

一、計算機網絡

1、計算機網絡是指將地理位置不同的具有獨立功能的多臺計算機及其外部設備,通過通信線路連接起來,在網絡操作系統,網絡管理軟件及網絡通信協議的管理和協調下,實現資源共享和信息傳遞的計算機系統。

2、計算機網絡的功能
	數據通信
	資源共享
	提高系統的可靠性
	分佈式網絡處理和負載均衡

3、計算機網絡的組成
	通信子網	:		網卡、線纜、集線器、中繼器、交換機、路由器
	資源子網	:		網絡中的計算機、打印機、電話等一些可以提供服務的設備。
	計算機網絡軟件	 :	
		協議軟件:它規定了計算機之間通信的規則,TCP/IP協議簇。
		網絡通信軟件:網絡中實現計算機與設備之間的通信軟件。(網卡驅動)
		網絡管理軟件:防火牆,SELinux
		網絡應用軟件:瀏覽器、迅雷
		網絡操作系統:可以提供網絡服務的計算機操作系統,windows server2008、UNIX、Linux
4、計算機網絡            的分類
	按網絡作用範圍劃分:局域網、城域網、廣域網
	按網絡技術劃分:廣播式網絡、點到點網絡
	按傳輸介質劃分:有線網、無線網、微波通信、衛星通信
5、網絡拓撲結構
	星型、樹型、總線型、環型、網狀型
6、計算機網絡的發展過程
	1、以計算機爲中心的聯機系統
	2、分組交換網絡的誕生
	3、網絡體系結構與協議標準化
		20世紀80年代ISO 提出開放式系統互聯參考模型(OSI)。
		由於這個模型照顧到了各方的利益,所以太過龐大,因此至今都沒有成熟的產品,目前我們所使用是一系列協議的集合,簡稱TCP/IP簇,通常也叫TCP/IP模型。
		目前所有的計算機系統都按照這份協議進行通信,所以不同的操作系統之間纔可能進行網絡通信。
		C/C++/Java/python->windows->socket->TCP/IP<->TCP/IP->socket->Linux->C/C++/Java/python
	4、高速計算機網絡(5G)		
7、網卡
	它負責將數據發送到網絡上,也負責從網絡中獲取數據,每個網卡上都有一個獨一無二的MAC地址
8、OSI參考模型與TCP/IP參考模型
	網絡協議是爲網絡數據交換而制定的規則、約束、標準,一個功能完備的計算機網絡需要制定一整套複雜的協議集,目前的網絡協議是按層次結構組織的,網絡層次結構模型與各協議的集合稱爲網絡體系結構。
	OSI 從下到上一共七層:物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用層
	TCP/IP目前只實現四層,從下到上:
	物理層:負責通信網絡收發數據包
	網絡層:選擇、流量控制、網絡擁塞、IP協議是該層的核心
	傳輸層:機器之間建立用於會話的端到端連接(用於數據傳輸),該層的核心是TCP/UDP。
	應用層:主要爲用戶提供了針對性的服務,這一層的代表協議有:HTTP,SMTP(郵件傳輸協議),FTP(文件傳輸協議)、SNMP、THLNET。
	OSI			TCP
	------------------		
	物理層
	數據鏈路層	物理層
	------------------
	網絡層		網絡層
	------------------
	傳輸層		傳輸層
	------------------
	會話層
	表示層		應用層
	應用層		
	------------------
	
9、IP地址ipv4
	在計算機網絡中每一臺計算機都必須有一個唯一的標識(MAC地址不容易記憶),它就是IP地址。目前在計算機以 .分十進制表示(4個不超過255的整數),但在程序中它就是4字節的整數。	
	IP地址的分類:
	A類:第一個二進制位必須是
		0.0.0.0~127.255.255.255
	B類:前兩位的二進制必須是10
		128.0.0.0~191.255.255.255
	C類:前三位的二級制必須是110
		192.0.0.0~223.255.255.255
	D類:前四位的二進制必須是1110
		224.0.0.0~239.255.255.255
	E類:前四位的二進制必須是1111
		240.0.0.0~255.255.255.255

10、公有IP和私有IP
	公有IP:在網絡服務提供商登記過的IP叫公有IP
	私有IP:由一些公司或組織自己分配的,不能在網絡中公開直接訪問	
11、子網掩碼:
	由4個不超過255的整數組成,由 .分十進制表示
	網絡地址=ip地址 按位 & 子網掩碼
	只有在同一子網內的IP地址纔可能直接進行通信,否則必須進過路由器
	
12、網關地址:
	負責子網出口的計算機,一般由路由器來擔任(路由器就是一臺具有路由功能的計算機)。
13、端口號
	ip地址能決定我們與哪一臺計算機通信,而端口號決定了我們與計算機上的哪個進程通信
	1~1024 基本上已經被操作系統預定完了因此我們在編程時一般要1024以上
	http:80 ftp:21 ssh:22 telnet:23

二、網絡通信的基本概念

1、TCP和UDP的區別
	TCP:傳輸控制協議,面向連接的服務(打電話),安全、可靠(三次握手、響應+重傳、四次揮手),速度相對較慢,一般應用在對安全性、完整性有嚴格要求的場景:FTP、SMTP、HTTP
		
		三次握手:
		四次揮手:
			目的是保證關閉前發送完所有數據包(應用層已經交給底層了,底層還沒有完全發送出去)
			
	UCP:用戶數據報文協議,面向無鏈接的服務(發短信),不保證安全、可靠,但大多數情況下是可靠的速度相對較快,流媒體(在線的視頻、音頻)。
		
2、消息流
	應用層->表示層->會話層->網絡層->傳輸層->數據鏈路層->物理層->物理層->數據鏈路層->傳輸層->網絡層->會話層->表示層->應用層
	
3、消息包
	當socket收到一個要發送的數據時,會先把數據進行拆分,拆分成Bit流,然後再組成(防丟失)數據包(可能會丟包)。

三、套接字

socket是一種接口機制,可以讓程序無論使用什麼端口、協議,都可以從socket進出數據,它負責了進程與協議之間鏈接。
1、編程模式
	點對點(p2p):一對一的通信
	客戶機/服務器(C/S):一對多

2、創建socket
	int socket(int domain, int type, int protocol);
	功能:創建socket描述符,可以把socket當作文件來看待,發數據就是寫文件,接收數據就是讀文件。
	domain:地址類型
		AF_UNIX/AF_LOCAL/AF_FILE	本地通信(進程間通信)
		AF_INET      				基於32IP地址通信,IPv4
		AF_INET6					基於128IP地址通信,IPv6
	type:通信協議
		SOCK_STREAM			數據流協議,TCP
		SOCK_DGRAM			數據包協議,UDP
	protocol:特別通信協議,給0即可。	
3、通信地址
	注意:函數接口定義的是sockaddr,而實際提供的是sockaddr_un或sockaddr_in
	struct sockaddr {
           sa_family_t sa_family;
           char        sa_data[14];
       }
       
	struct sockaddr_un
	{
		_SCIKADDR_COMMON (sun_);	//地址類型  參看domain
		char sun_path[108];			//socket文件的路徑
	};
	
	struct sockaddr_in
	{
		_SOCKADDR_COMMON (sun_);	
		in_port_t sin_port;		//端口號 大端字節序
		struct in_addr sin_addr	//ip地址 大端4字節整數
	}
	
	struct in_addr
	{
		in_addr_t s_addr;
	};
	
4、綁定
	socket描述符與物理通信載體(網卡或socket文件)綁定在一起。	
	int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
	sockfd:socket描述符:socket函數的返回值
	addr:通信地址結構體,實際給的是sockaddr_un或sockaddr_in,需要強制類型轉換
	addrlen:通信地址結構體類型的字節數,使用sizeof計算
	返回值:成功返回0,失敗返回-1.
5、連接
	int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
	sockfd:socket描述符
	addr:通信目標地址
	addrlen:通信地址結構體類型的字節數,使用sizeof計算
	返回值:在不同的編程模型下返回值意義不同,在本地通信返回值加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)
	功能:把點分十進制的ip地址(字符串)轉換成32爲無符號整數,使用結構指針獲取
	
	in_addr_t inet_addr(const char *cp);
	功能:把點分十進制的ip地址(字符串)轉換成32爲無符號整數,使用返回值直接返回
	
	char *inet_ntoa(struct in_addr in);
	功能:32位無符號整數表示的ip地址,轉換成點分十進制的ip地址(字符串)
10、本地通信編程模型
	進程A						進程B
	創建套接字(AF_LOCAL)			創建套接字(AF_LOCAL)
	準備地址(sockaddr_un)		準備地址(sockaddr_un)
	綁定(自己的socket/地址)		連接(connect,連接進程A的地址)
	接收數據						發送數據
	關閉套接字					關閉套接字

四、基於TCP協議的C/S模型

int listen(int sockfd, int backlog);
功能:設置等待連接的最大數量
sickfd:被監聽的socket描述符
backlog:等待連接的最大數	量(排隊的數量)

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:等待連接,socket連接
addr獲取連接的地址
addrlen:設置連接地址結構體的長度
返回值:專門用於通信的描述符

編程模型:
Server								Client
創建socket套接字						創建socket套接字
準備地址(sockaddr_in,本機地址)		準備地址(服務器地址)
綁定(bind)							......
監聽(listen)						......
等待連接(accept、fork)				連接(connect)
接收請求(read/recv)					發送請求(write/send)
響應請求(rend/write)				接收響應(read/recv)
關閉(close)							關閉(close)

五、基於UDP協議的C/S模型

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
功能:UDP協議專用的數據發送函數
sockfd:套接字描述符
buf:待發送的緩衝區首地址
len:待發送的數據字節數
flags:0阻塞,1不阻塞
dest_addr:目標計算機地址
addrlen:地址結構體的字節數
返回值:成功發送的字節數

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
功能:UDP協議專用的數據接收函數
sockfd:套接字描述符
buf:數據存儲位置
len:最大接收字節數
flags:0阻塞,1不阻塞
src_addr:獲取發送者的地址
addrlen:設置地址結構體的字節數
返回值:成功接收的字節數

編程模型:
Server								Client
創建套接字(socket)					創建套接字(socket)
準備地址(本機地址sockaddr_in)			準備地址(目標機的地址)
綁定(bind(sockfd+addr))				......
接收請求(recvfrom)					發送請求(sendto)
響應請求(sendto)					接收響應(recvfrom)
關閉套接字(close)					關閉套接字(close)

注意:從服務器到客戶端返回的路線是UDP協議自己設計的

七、windows下的網絡編程

一般的軟件都Linux/UNIX作爲服務器,而windows系統作爲客戶端,windows下的socket編程的接口與Linux基本一致,函數聲明在winsock2.h頭文件中
int WSAStartup(WORD,LPWSADATA)
功能:初始化網絡庫
WORD:設置網絡庫的版本
	MAKEWORD(1,2),第一個是主版本號,第二個是副版本號
LPWSADATA:WSADATA數據結構的指針,用來獲取網絡的相關信息

closesocket(sockfd);
功能:關閉socket

int WSACleanup(void)
功能:卸載庫

注意:編譯時添加 -lws2_32
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章