一文入门网络编程:常见协议、通信过程、Socket、CS/BS、TCP/UDP
網(wǎng)絡(luò)編程三要素:ip地址、端口、協(xié)議,在網(wǎng)絡(luò)通信協(xié)議下,不同計(jì)算機(jī)上運(yùn)行的程序,可以進(jìn)行數(shù)據(jù)傳輸
常見(jiàn)協(xié)議:
- 傳輸層 常見(jiàn)協(xié)議有TCP/UDP協(xié)議。
- 應(yīng)用層 常見(jiàn)的協(xié)議有HTTP協(xié)議,FTP協(xié)議。
- 網(wǎng)絡(luò)層 常見(jiàn)協(xié)議有IP協(xié)議、ICMP協(xié)議、IGMP協(xié)議。
- 網(wǎng)絡(luò)接口層 常見(jiàn)協(xié)議有ARP協(xié)議、RARP協(xié)議。
- TCP傳輸控制協(xié)議(Transmission Control Protocol)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。
- UDP用戶數(shù)據(jù)報(bào)協(xié)議(User Datagram Protocol)是OSI參考模型中一種無(wú)連接的傳輸層協(xié)議,提供面向事務(wù)的簡(jiǎn)單不可靠信息傳送服務(wù)。
- HTTP超文本傳輸協(xié)議(Hyper Text Transfer Protocol)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議。
- FTP文件傳輸協(xié)議(File Transfer Protocol)
- IP協(xié)議是因特網(wǎng)互聯(lián)協(xié)議(Internet Protocol)
- ICMP協(xié)議是Internet控制報(bào)文協(xié)議(Internet Control Message Protocol)它是TCP/IP協(xié)議族的一個(gè)子協(xié)議,用于在IP主機(jī)、路由器之間傳遞控制消息。
- IGMP協(xié)議是 Internet 組管理協(xié)議(Internet Group Management Protocol),是因特網(wǎng)協(xié)議家族中的一個(gè)組播協(xié)議。該協(xié)議運(yùn)行在主機(jī)和組播路由器之間。
- ARP協(xié)議是正向地址解析協(xié)議(Address Resolution Protocol),通過(guò)已知的IP,尋找對(duì)應(yīng)主機(jī)的MAC地址。
- RARP是反向地址轉(zhuǎn)換協(xié)議,通過(guò)MAC地址確定IP地址。
IP地址:
- 要想讓網(wǎng)絡(luò)中的計(jì)算機(jī)能夠互相通信,必須為每臺(tái)計(jì)算機(jī)指定一個(gè)標(biāo)識(shí)號(hào),通過(guò)這個(gè)標(biāo)識(shí)號(hào)來(lái)指定要接收數(shù)據(jù)的計(jì)算機(jī)和識(shí)別發(fā)送的計(jì)算機(jī),而IP地址就是這個(gè)標(biāo)識(shí)號(hào),也就是設(shè)備唯一的標(biāo)識(shí)
IP地址分為兩大類:
IPv4
是給每個(gè)連接在網(wǎng)絡(luò)上的主機(jī)分配一個(gè)32bit地址。按照TCP/IP規(guī)定,IP地址用二進(jìn)制來(lái)表示,每個(gè)IP地址長(zhǎng)32bit,也就是4個(gè)字節(jié)。例如一個(gè)采用二進(jìn)制形式的IP地址是“11000000 10101000 00000001 01000010”,這么長(zhǎng)的地址,處理起來(lái)也太費(fèi)勁了。為了方便使用,IP地址經(jīng)常被寫(xiě)成十進(jìn)制的形式,中間使用符號(hào)“.”分隔不同的字節(jié)。于是,上面的IP地址可以表示為“192.168.1.66”。IP地址的這種表示法叫做“點(diǎn)分十進(jìn)制表示法”,這顯然比1和0容易記憶得多
IPv6
由于互聯(lián)網(wǎng)的蓬勃發(fā)展,IP地址的需求量愈來(lái)愈大,但是網(wǎng)絡(luò)地址資源有限,使得IP的分配越發(fā)緊張。為了擴(kuò)大地址空間,通過(guò)IPv6重新定義地址空間,采用128位地址長(zhǎng)度,每16個(gè)字節(jié)一組,分成8組十六進(jìn)制數(shù),這樣就解決了網(wǎng)絡(luò)地址資源數(shù)量不夠的問(wèn)題
冒分十六進(jìn)制表示法:
如果計(jì)算出的16進(jìn)制表示形式中間有多個(gè)連續(xù)的0,可以用兩個(gè)冒號(hào)省略,計(jì)算機(jī)會(huì)識(shí)別出并自動(dòng)補(bǔ)全省略的0
例如:FF01:0:0:0:0:0:0:1101可以壓縮為FF01::1101
DOS常用命令:
-
ipconfig:查看本機(jī)IP地址
-
ping IP地址:檢查網(wǎng)絡(luò)是否連通
-
特殊IP地址:
- 127.0.0.1:是回送地址,可以代表本機(jī)地址,一般用來(lái)測(cè)試使用
端口:
端口
網(wǎng)絡(luò)的通信,本質(zhì)上是兩個(gè)應(yīng)用程序的通信。每臺(tái)計(jì)算機(jī)都有很多的應(yīng)用程序,那么在網(wǎng)絡(luò)通信時(shí),如何區(qū)分這些應(yīng)用程序呢?如果說(shuō)IP地址可以唯一標(biāo)識(shí)網(wǎng)絡(luò)中的設(shè)備,那么端口號(hào)就可以唯一標(biāo)識(shí)設(shè)備中的應(yīng)用程序了。也就是應(yīng)用程序的標(biāo)識(shí)
端口號(hào)
- 用兩個(gè)字節(jié)表示的整數(shù),它的取值范圍是0 ~ 65535。其中,0 ~ 1023之間的端口號(hào)用于一些知名的網(wǎng)絡(luò)服務(wù)和應(yīng)用,普通的應(yīng)用程序需要使用1024以上的端口號(hào)。
- 一個(gè)端口號(hào)只能被一個(gè)程序使用,如果端口號(hào)被另外一個(gè)服務(wù)或應(yīng)用所占用,會(huì)導(dǎo)致當(dāng)前程序啟動(dòng)失敗
協(xié)議:
通過(guò)計(jì)算機(jī)網(wǎng)絡(luò)可以使多臺(tái)計(jì)算機(jī)實(shí)現(xiàn)連接,位于同一個(gè)網(wǎng)絡(luò)中的計(jì)算機(jī)在進(jìn)行連接和通信時(shí)需要遵守一定的規(guī)則,這就好比在道路中行駛的汽車(chē)一定要遵守交通規(guī)則一樣。在計(jì)算機(jī)網(wǎng)絡(luò)中,這些連接和通信的規(guī)則被稱為網(wǎng)絡(luò)通信協(xié)議,它對(duì)數(shù)據(jù)的傳輸格式、傳輸速率、傳輸步驟等做了統(tǒng)一規(guī)定,通信雙方必須同時(shí)遵守才能完成數(shù)據(jù)交換。常見(jiàn)的協(xié)議有UDP協(xié)議和TCP協(xié)議
TCP:
TCP協(xié)議是比較安全的通信協(xié)議,輸數(shù)據(jù)之前,在發(fā)送端和接收端建立邏輯連接,然后再傳輸數(shù)據(jù),它提供了兩臺(tái)計(jì)算機(jī)之間可靠無(wú)差錯(cuò)的數(shù)據(jù)傳輸。在TCP連接中必須要明確客戶端與服務(wù)器端,由客戶端向服務(wù)端發(fā)出連接請(qǐng)求,每次連接的創(chuàng)建都需要經(jīng)過(guò)“三次握手”,斷開(kāi)連接的時(shí)候需要四次揮手
特點(diǎn):
1.需要建立連接
2.不會(huì)丟失數(shù)據(jù)、有序、安全
3.速度慢
4.建立連接后以流的形式傳輸,沒(méi)有大小限制
UDP:
UDP是無(wú)連接通信協(xié)議,在數(shù)據(jù)傳輸時(shí),數(shù)據(jù)的發(fā)送端和接收端不建立邏輯連接。
簡(jiǎn)單來(lái)說(shuō),當(dāng)一臺(tái) 計(jì)算機(jī)向另外一臺(tái)計(jì)算機(jī)發(fā)送數(shù)據(jù)時(shí),發(fā)送端不會(huì)確認(rèn)接收端是否存在,就會(huì)發(fā)出數(shù)據(jù),同樣接收端在收到數(shù)據(jù)時(shí),也不會(huì)向發(fā)送端反饋是否收到數(shù)據(jù)。 由于使用UDP協(xié)議消耗系統(tǒng)資源小,通信效率高,所以通常都會(huì)用于音頻、視頻、視頻會(huì)議和普通數(shù)據(jù)的傳輸采用UDP協(xié)議,即使偶爾丟失一兩個(gè)數(shù)據(jù)包,也不會(huì)對(duì)接收結(jié)果產(chǎn)生太大影響。但是在使用UDP協(xié)議傳送數(shù)據(jù)時(shí),由于UDP的面向無(wú)連接性,不能保證數(shù)據(jù)的完整性,因此在傳輸重要數(shù)據(jù)時(shí)不建議使用UDP協(xié)議
UDP底層不會(huì)做校驗(yàn),數(shù)據(jù)丟了就丟了,但是可以在應(yīng)用層做校驗(yàn),這樣就可以彌補(bǔ)安全方面的問(wèn)題,也就是前期需要把校驗(yàn)的架子做好,后面就會(huì)很方便。比如QQ就是用的UDP,不可能說(shuō)消息丟了就丟了,都是上層做的校驗(yàn)的,但是對(duì)于中小型公司來(lái)說(shuō)還不如直接用TCP來(lái)的實(shí)在,畢竟麻煩,TCP雖然建立連接的時(shí)候會(huì)慢一點(diǎn),但是對(duì)于很多場(chǎng)景基本上是可以忽略不計(jì)的,并且TCP是很規(guī)范化的。
特點(diǎn):
1.不需要建立連接
2.可能會(huì)丟失數(shù)據(jù)、無(wú)序、不穩(wěn)定、安全低
3.速度塊
4.每個(gè)包最大64kb
UDP與TCP的使用場(chǎng)景
| 面向連接 | 面向無(wú)連接 |
| 要求系統(tǒng)資源較多 | 要求系統(tǒng)資源較少 |
| TCP程序結(jié)構(gòu)較復(fù)雜 | UDP程序結(jié)構(gòu)較簡(jiǎn)單 |
| 使用流式 | 使用數(shù)據(jù)包式 |
| 保證數(shù)據(jù)準(zhǔn)確性 | 不保證數(shù)據(jù)準(zhǔn)確性 |
| 保證數(shù)據(jù)順序 | 不保證數(shù)據(jù)順序 |
| 通訊速度較慢 | 通訊速度較快 |
TCP應(yīng)用場(chǎng)景:
對(duì)數(shù)據(jù)傳輸安全性要求高,比如文件傳輸
UDP應(yīng)用場(chǎng)景:
對(duì)數(shù)據(jù)實(shí)時(shí)傳輸要求比較高,比如視頻、通話、游戲
網(wǎng)絡(luò)分層架構(gòu)(分層模型):
為了減少協(xié)議設(shè)計(jì)的復(fù)雜性,大多數(shù)網(wǎng)絡(luò)模型均采用分層的方式來(lái)組織。每一層都有自己的功能,就像建筑物一樣,每一層都靠下一層支持。每一層利用下一層提供的服務(wù)來(lái)為上一層提供服務(wù),本層服務(wù)的實(shí)現(xiàn)細(xì)節(jié)對(duì)上層屏蔽。
業(yè)內(nèi)普遍的分層方式有兩種。OSI七層模型 和TCP/IP四層模型。可以通過(guò)背誦兩個(gè)口訣來(lái)快速記憶:
- OSI七層模型:物、數(shù)、網(wǎng)、傳、會(huì)、表、應(yīng)
- TCP/IP四層模型:鏈、網(wǎng)、傳、應(yīng)
主要是將從下層接收的數(shù)據(jù)進(jìn)行分段和傳輸,到達(dá)目的地址后再進(jìn)行重組。常常把這一層數(shù)據(jù)叫做段。
網(wǎng)絡(luò)的每一層,都定義了很多協(xié)議。這些協(xié)議的總稱,叫“TCP/IP協(xié)議”。TCP/IP協(xié)議是一個(gè)大家族,不僅僅只有TCP和IP協(xié)議,它還包括其它的協(xié)議,如下圖:
鏈路層:
以太網(wǎng)規(guī)定,連入網(wǎng)絡(luò)的所有設(shè)備,都必須具有“網(wǎng)卡”接口。數(shù)據(jù)包必須是從一塊網(wǎng)卡,傳送到另一塊網(wǎng)卡。通過(guò)網(wǎng)卡能夠使不同的計(jì)算機(jī)之間連接,從而完成數(shù)據(jù)通信等功能。網(wǎng)卡的地址——MAC 地址,就是數(shù)據(jù)包的物理發(fā)送地址和物理接收地址。
ARP協(xié)議:借助Ip地址獲取Mac地址
網(wǎng)絡(luò)層:
- 網(wǎng)絡(luò)層的作用是引進(jìn)一套新的地址,使得我們能夠區(qū)分不同的計(jì)算機(jī)是否屬于同一個(gè)子網(wǎng)絡(luò)。這套地址就叫做“網(wǎng)絡(luò)地址”,這是我們平時(shí)所說(shuō)的IP地址。這個(gè)IP地址好比我們的手機(jī)號(hào)碼,通過(guò)手機(jī)號(hào)碼可以得到用戶所在的歸屬地。
- 網(wǎng)絡(luò)地址幫助我們確定計(jì)算機(jī)所在的子網(wǎng)絡(luò),MAC 地址則將數(shù)據(jù)包送到該子網(wǎng)絡(luò)中的目標(biāo)網(wǎng)卡。網(wǎng)絡(luò)層協(xié)議包含的主要信息是源IP和目的IP。
于是,“網(wǎng)絡(luò)層”出現(xiàn)以后,每臺(tái)計(jì)算機(jī)有了兩種地址,一種是 MAC 地址,另一種是網(wǎng)絡(luò)地址。兩種地址之間沒(méi)有任何聯(lián)系,MAC 地址是綁定在網(wǎng)卡上的,網(wǎng)絡(luò)地址則是管理員分配的,它們只是隨機(jī)組合在一起。 - 網(wǎng)絡(luò)地址幫助我們確定計(jì)算機(jī)所在的子網(wǎng)絡(luò),MAC 地址則將數(shù)據(jù)包送到該子網(wǎng)絡(luò)中的目標(biāo)網(wǎng)卡。因此,從邏輯上可以推斷,必定是先處理網(wǎng)絡(luò)地址,然后再處理 MAC 地址。
傳輸層:
當(dāng)我們一邊聊QQ,一邊聊微信,當(dāng)一個(gè)數(shù)據(jù)包從互聯(lián)網(wǎng)上發(fā)來(lái)的時(shí)候,我們?cè)趺粗?#xff0c;它是來(lái)自QQ的內(nèi)容,還是來(lái)自微信的內(nèi)容?
也就是說(shuō),我們還需要一個(gè)參數(shù),表示這個(gè)數(shù)據(jù)包到底供哪個(gè)程序(進(jìn)程)使用。這個(gè)參數(shù)就叫做端口 port,它其實(shí)是每一個(gè)使用網(wǎng)卡的程序的編號(hào)。每個(gè)數(shù)據(jù)包都發(fā)到主機(jī)的特定端口,所以不同的程序就能取到自己所需要的數(shù)據(jù)。
端口特點(diǎn):
- 對(duì)于同一個(gè)端口,在不同系統(tǒng)中對(duì)應(yīng)著不同的進(jìn)程
- 對(duì)于同一個(gè)系統(tǒng),一個(gè)端口只能被一個(gè)進(jìn)程擁有
應(yīng)用層:
應(yīng)用程序收到“傳輸層”的數(shù)據(jù),接下來(lái)就要進(jìn)行解讀。由于互聯(lián)網(wǎng)是開(kāi)放架構(gòu),數(shù)據(jù)來(lái)源五花八門(mén),必須事先規(guī)定好格式,否則根本無(wú)法解讀。“應(yīng)用層”的作用,就是規(guī)定應(yīng)用程序的數(shù)據(jù)格式。
協(xié)議功能:
通信過(guò)程:
兩臺(tái)計(jì)算機(jī)通過(guò)TCP/IP協(xié)議通訊的過(guò)程如下所示:
將Hello發(fā)送到一臺(tái)計(jì)算機(jī)的執(zhí)行過(guò)程
封裝過(guò)程是自上向下的:
接收端的解封裝是反向執(zhí)行的
Socket:
- Socket,是插座、插孔的意思,一般稱之為套接字,用于描述IP地址和端口,可以實(shí)現(xiàn)不同程序間的數(shù)據(jù)通信。
- Socket起源于Unix,而Unix基本哲學(xué)之一就是“一切皆文件”,都可以用“打開(kāi)open –> 讀寫(xiě)write/read –> 關(guān)閉close”模式來(lái)操作。Socket就是該模式的一個(gè)實(shí)現(xiàn),網(wǎng)絡(luò)的Socket數(shù)據(jù)傳輸是一種特殊的I/O,Socket也是一種文件描述符。Socket也具有一個(gè)類似于打開(kāi)文件的函數(shù)調(diào)用:Socket(),該函數(shù)返回一個(gè)整型的Socket描述符,隨后的連接建立、數(shù)據(jù)傳輸?shù)炔僮鞫际峭ㄟ^(guò)該Socket實(shí)現(xiàn)的。
- Socket底層是封裝了兩個(gè)單向的channel,進(jìn)行網(wǎng)絡(luò)通信時(shí)Socket都是成對(duì)出現(xiàn)的。
- 在TCP/IP協(xié)議中,IP地址+TCP/UDP端口號(hào)唯一標(biāo)識(shí)網(wǎng)絡(luò)通訊中的一個(gè)進(jìn)程。IP地址+端口號(hào)就對(duì)應(yīng)一個(gè)socket。欲建立連接的兩個(gè)進(jìn)程各自有一個(gè)socket來(lái)標(biāo)識(shí),那么這兩個(gè)socket組成的socket pair就唯一標(biāo)識(shí)一個(gè)連接。因此可以用Socket來(lái)描述網(wǎng)絡(luò)連接的一對(duì)一關(guān)系。
- 常用的Socket類型有兩種:流式Socket(SOCK_STREAM)和數(shù)據(jù)報(bào)式Socket(SOCK_DGRAM)。流式是一種面向連接的Socket,針對(duì)于面向連接的TCP服務(wù)應(yīng)用;數(shù)據(jù)報(bào)式Socket是一種無(wú)連接的Socket,對(duì)應(yīng)于無(wú)連接的UDP服務(wù)應(yīng)用。
網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì)模式C/S和B/S:
C/S模式
傳統(tǒng)的網(wǎng)絡(luò)應(yīng)用設(shè)計(jì)模式,客戶端(client)/服務(wù)器(server)模式。需要在通訊兩端各自部署客戶機(jī)和服務(wù)器來(lái)完成數(shù)據(jù)通信。
B/S模式
瀏覽器(Browser)/服務(wù)器(Server)模式。只需在一端部署服務(wù)器,而另外一端使用每臺(tái)PC都默認(rèn)配置的瀏覽器即可完成數(shù)據(jù)的傳輸。
C/S優(yōu)點(diǎn):
客戶端位于目標(biāo)主機(jī)上可以保證性能,將數(shù)據(jù)緩存至客戶端本地,從而提高數(shù)據(jù)傳輸效率。一般來(lái)說(shuō)客戶端和服務(wù)器程序由一個(gè)開(kāi)發(fā)團(tuán)隊(duì)創(chuàng)作,所以他們之間所采用的協(xié)議相對(duì)靈活。可以在標(biāo)準(zhǔn)協(xié)議的基礎(chǔ)上根據(jù)需求裁剪及定制。例如,騰訊所采用的通信協(xié)議,即為ftp協(xié)議的修改剪裁版。因此,傳統(tǒng)的網(wǎng)絡(luò)應(yīng)用程序及較大型的網(wǎng)絡(luò)應(yīng)用程序都首選C/S模式進(jìn)行開(kāi)發(fā)。如,知名的網(wǎng)絡(luò)游戲魔獸世界。3D畫(huà)面,數(shù)據(jù)量龐大,使用C/S模式可以提前在本地進(jìn)行大量數(shù)據(jù)的緩存處理,從而提高觀感。
C/S缺點(diǎn):
由于客戶端和服務(wù)器都需要有一個(gè)開(kāi)發(fā)團(tuán)隊(duì)來(lái)完成開(kāi)發(fā)。工作量將成倍提升,開(kāi)發(fā)周期較長(zhǎng)。從用戶角度出發(fā),需要將客戶端安插至用戶主機(jī)上,對(duì)用戶主機(jī)的安全性構(gòu)成威脅。這也是很多用戶不愿使用C/S模式應(yīng)用程序的重要原因。
B/S優(yōu)點(diǎn):
由于它沒(méi)有獨(dú)立的客戶端,使用標(biāo)準(zhǔn)瀏覽器作為客戶端,工作開(kāi)發(fā)量較小。只需開(kāi)發(fā)服務(wù)器端即可。另外由于其采用瀏覽器顯示數(shù)據(jù),因此移植性非常好,不受平臺(tái)限制。如早期的偷菜游戲,在各個(gè)平臺(tái)上都可以完美運(yùn)行。
B/S缺點(diǎn):
由于使用第三方瀏覽器,因此網(wǎng)絡(luò)應(yīng)用支持受限。另外,沒(méi)有客戶端放到對(duì)方主機(jī)上,緩存數(shù)據(jù)不盡如人意,從而傳輸數(shù)據(jù)量受到限制。應(yīng)用的觀感大打折扣。而且必須與瀏覽器一樣,采用標(biāo)準(zhǔn)http協(xié)議進(jìn)行通信,協(xié)議選擇不靈活。因此在開(kāi)發(fā)過(guò)程中,模式的選擇由上述各自的特點(diǎn)決定。根據(jù)實(shí)際需求選擇應(yīng)用程序設(shè)計(jì)模式。
TCP的C/S架構(gòu):
總結(jié)
以上是生活随笔為你收集整理的一文入门网络编程:常见协议、通信过程、Socket、CS/BS、TCP/UDP的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: oracle数据库生产,从安装系统到or
- 下一篇: php 区位码字符,php汉字如何转区位