一.計算機網絡
1.什麼是計算機網絡:它是計算機技術和通訊技術相結合的產物。
2.計算機網絡的功能:
a.數據通訊
b.資源共享
c.提升系統的可靠性
d.分佈式網絡處理和負載均衡
3.計算機網絡的組成
1.通訊子網絡:由網卡,線纜,集線器(存粹物理上的),中繼器,交換機(),路由器(網絡之間的交流)
2.資源子網絡:網絡中的計算機,打印機等一些能夠提供的設備
3.計算機網絡軟件
協議軟件:它規定了計算機之間通訊的準則,最多見的協議TCP/IP協議簇
網絡通訊軟件:網絡中實現計算機於設備之間通訊的軟件
網絡操做系統:能夠提供網絡服務的計算機操做系統,常見的網絡操做系統,windows server2008(使用簡單,有圖形界面,鼠標操做,不太穩定) UNIX Linux
網絡管理軟件和網絡應用軟件:
管理:防火牆,SELinux
應用:瀏覽器,迅雷,ftp客戶端
4.計算機網絡的分類
1.網絡的做用範圍來分
局域網
城域網
廣域網
2.按網絡的傳播技術來劃分
廣播式網絡
點到點網絡
3.傳輸介質劃分
有線網,無線網,微波通訊,衛星通訊
5.計算機網絡的拓撲結構
1.星型拓撲結構
2.樹形拓撲結構
3.總線型拓撲結構
4.環形拓撲結構
5.網狀型拓撲結構
6.計算機網絡的發展過程
1.以計算機爲中心的聯機系統
2.分組交換網絡的誕生
3.網絡體系結構與協議標準化
20世紀八十年代,ISO組織提出
開放式系統互連參考模式(OSI),這個模型照顧到了各方的利益,因此太過龐大,所以至今沒有推出成熟的產品,
TCP/IP符合OSI標準的協議。
異構:操做系統(windows) ->socket->TCP/IP ->TCP/IP -> socket ->Linux
4.高速計算機網絡
7.
網卡:網絡接口卡或網絡適配器,它負責講數據發送到網絡中去,也負責從網絡中獲取數據,每一張網卡上會有一個
獨一無二MAC地址。
8.OSI/RM結構與TCP/IP模型
OSI/RM結構七層: 物理層,數據鏈路層,網絡層, 傳輸層, 會話層, 表示層,應用層
TCP/IP模型四層結構:物理層, 網絡層, 傳輸層, 應用層(間隔順序表示二者相對應的部分)
物理層:負責通訊網絡收發數據包
網絡層:選擇,流量控制,與網絡擁塞問題,IP協議式該層的核心
傳輸層:機器之間創建端到端的鏈接(用於數據間的傳輸),該層的核心協議TCP/UDP
應用層:主要爲用戶提供針對性的服務,該層表明性的協議有:HTTP(超文本傳輸),SMTP(郵件傳輸),FTP(文件傳輸),TELNET(遠程登錄)
9.IPv4地址
在計算機網絡中的每一臺計算機都必須有一個惟一的標識符,它就是IP地址。目前由4個不超過255的整數組成,通常用點分十進制表示
ip地址的分類:
A類:
第一二進制位必須是0()
0.0.0.0
127.255.255.255
公網的地址
B類:前兩位的二進制位必須是10
128.0.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:由一些公司本身分配的,不能在網絡上公開直接訪問的IP地址
11.子網掩碼:目前由4個不超過255的整數組成,通常用點分十進制表示(255.255.255.0)
子網掩碼&ip地址 = 網絡地址
若是兩我的ip地址的網絡地址相同,那麼說明它們在同一個子網內,就能夠直接通訊而不須要路由
12.網關地址:負責子網出口的計算機,通常由路由器擔任(路由器就是一臺具備路由功能的計算機)
13.端口號:
操做系統爲須要通訊的進程分配一個獨一無二的編號,端口號能夠肯定與哪一個進程進行通訊
1-1024基本上已經被操做系統佔用了,通常編程要使用1024以上的。
http:80
ftp:21
telnet:23
二.套接字(socket:插座)
是一種能夠進行網絡通訊的內核對象,它有一個惟一的標識符,通常稱它爲socket描述符,跟文件描述符相似,也能夠用read/write/close操做
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
功能:建立socket對象
domain:通訊地址類型
AF_UNIX/AF_LOCAL:本地進程間通訊
AF_INET:使用ipv4地址通訊
AF_INET6:使用ipv6地址通訊
type:
SOCK_STREAM:數據流協議TCP,面向鏈接的通訊協議
優勢:安全可靠,數據不丟失,可是速度慢
通常經常使用於安全性較高的領域,可是速度不要求的場景下
SOCK_DGRAM:數據報協議UDP,面向無鏈接的通訊協議
優勢:速度快,數據可能丟失,安全性可靠性與TCP相比不高。
通常用於安全性要求不高,可是對速度有要求的場景
protocol:特殊協議通常不使用,通常寫0就好
準備通訊地址
基本的通訊地址
struct sockaddr {
sa_family_t sa_family;
char sa_data[14];
}
本地通訊地址
struct sockaddr_un
{
//通訊地址類型
sa_family_t sun_family;
//socket文件路徑
char sun_path[108];
}
網絡通訊地址
struct sockaddr_in
{
//通訊地址類型
short int sin_family;
//端口號
in_port_t sin_port;
//ip地址
struct in_addr sin_addr;
}
三.本地socket進程間通訊
A(B的地址+消息內容) -> B
B(A的地址+消息內容) -> A
進程A:建立socket -> 準備地址 -> 綁定 -> 鏈接 -> 接收/發送 -> 關閉socket -> 刪除socket文件
進程B:建立socket -> 準備地址 -> 鏈接 -> 綁定 -> 發送/接收 -> 關閉socket
進程B能夠給進程A發送消息,進程B也能夠給進程A發消息
一個socket文件只能綁定一個地址
int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
功能:把socket對象與通訊地址(本身)創建聯繫
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
功能:與通訊目標鏈接(與目標主機的地址)
四.網絡通訊(UDP)
點對點通訊(C to C)
網絡通訊地址
struct sockaddr_un
{
//通訊地址類型
short int sin_family;
//端口號
in_port_t sin_port;
//ip地址
struct in_addr sin_addr;
}
生成端口號:我的計算機多是大端,也多是小端,網絡通訊時,須要大端數據,必須把數據轉換成大端
端口號就是一個16位的無符號整數
uint16_t htons(uint16_t hostshort);
#include <arpa/inet.h>
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位主機字節序
生成IP地址:
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
in_addr_t inet_addr(const char *cp);
功能:把點分十進制的IP地址轉換位32位無符號整數
char *inet_ntoa(struct in_addr in);
功能:把32位的網絡字節序的ip地址轉換成點分十進制的字符串地址
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
功能:接收數據,並獲取發送端的地址
ps:addrlen是參數不是返回值
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
功能:發送數據到指定的目標
進程A:建立socket對象 -> 準備地址 -> 綁定 -> 接收數據和來時的地址 -> 原路返回數據 ->關閉
進程B:建立socket對象 -> 準備地址 -> 向目標發送數據 -> 接收數據 ->關閉socket
當socket對象被所有關閉後會在內核中,停留一段時間(給一個從新鏈接的機會),若是再使用一樣的ip地址和端口號就會失敗(延時關閉)
五.網絡通訊(TCP)
一對多鏈接(c to s)
面向鏈接的網絡通訊,在通訊過程當中時刻保持鏈接,這種通訊方式相似於
打電話,這種通訊方式能保證安全可靠數據不丟失,可是與udp相比,它的傳輸速度略低。
進程A :建立socket —> 準備地址 —> 綁定 —> 監聽(設置隊列長度) —> 等待鏈接 —> 進行通訊 —> 關閉
進程B :建立socket —> 準備地址 —> 鏈接 —> 通訊 —> 關閉
int listen(int sockfd, int backlog);
功能:設置最大的監聽數量
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:等待其餘主機與當前socket創建鏈接關係
返回值:創建好的鏈接的描述符,此後通訊都用此描述符
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函數的返回值爲-1時,鏈接斷開,此時應該結束死循環
練習:開啓一個服務端程序(建立socket,準備地址,綁定,等待鏈接,建立進程爲鏈接服務器,主進程繼續等待鏈接)
客戶端程序(建立socket,準備地址,鏈接,與服務端通訊)
爲何是三次握手:
什麼是安全的鏈接(A要知道:A->B,&& B->A,B要知道:A->B, && B->A)
而這樣的三次鏈接就保證了A和B都知道了上述信息
三次握手:
四次揮手:
1.爲何創建鏈接協議是三次握手,而關閉鏈接倒是四次握手呢?
這是由於服務端的LISTEN狀態下的SOCKET當收到SYN報文的建連請求後,它能夠把ACK和SYN(ACK起應答做用,而SYN起同步做用)放在一個報文裏來發送。但關閉鏈接時,當收到對方的FIN報文通知時,它僅僅表示對方沒有數據發送給你了;但未必你全部的數據都所有發送給對方了,因此你不能夠立刻關閉SOCKET,也即你可能還須要發送一些數據給對方以後,再發送FIN報文給對方來表示你贊成如今能夠關閉鏈接了,因此它這裏的ACK報文和FIN報文多數狀況下都是分開發送的。
2.爲何TIME_WAIT狀態還須要等2MSL後才能返回到CLOSED狀態?
這是由於雖然雙方都贊成關閉鏈接了,並且握手的4個報文也都協調和發送完畢,按理能夠直接回到CLOSED狀態(就比如從SYN_SEND狀態到ESTABLISH狀態那樣);可是由於咱們必需要假想網絡是不可靠的,你沒法保證你最後發送的ACK報文會必定被對方收到,所以對方處於LAST_ACK狀態下的SOCKET可能會由於超時未收到ACK報文,而重發FIN報文,因此這個TIME_WAIT狀態的做用就是用來重發可能丟失的ACK報文。
TCP三次握手和四次揮手(詳解)