tcp/ip簡介
為了把全世界的所有不同類型的計算機都連接起來,就必須規(guī)定一套全球通用的協(xié)議,為了實現(xiàn)互聯(lián)網(wǎng)這個目標,互聯(lián)網(wǎng)協(xié)議簇(Internet?Protocol?Suite)就是通用協(xié)議標準。
因為互聯(lián)網(wǎng)協(xié)議包含了上百種協(xié)議標準,但是最重要的兩個協(xié)議是TCP和IP協(xié)議,所以,大家把互聯(lián)網(wǎng)的協(xié)議簡稱TCP/IP協(xié)議
常用的網(wǎng)絡協(xié)議如下圖所示:


7層的時候

說明:
網(wǎng)際層也稱為:網(wǎng)絡層
網(wǎng)絡接口層也稱為:鏈路層
1.?什么是端口
在linux系統(tǒng)中,端口可以有65536(2的16次方)個之多!
2.?端口號
端口是通過端口號來標記的,端口號只有整數(shù),范圍是從0到65535
3.?端口是怎樣分配的
端口號不是隨意使用的,而是按照一定的規(guī)定進行分配。
端口的分類標準有好幾種,我們這里不做詳細講解,只介紹一下知名端口和動態(tài)端口
3.1?知名端口(Well?Known?Ports)
知名端口是眾所周知的端口號,范圍從0到1023
80端口分配給HTTP服務
21端口分配給FTP服務
可以理解為,一些常用的功能使用的號碼是估計的,好比?電話號碼110、
3.2?動態(tài)端口(Dynamic?Ports)
動態(tài)端口的范圍是從1024到65535
之所以稱為動態(tài)端口,是因為它一般不固定分配某種服務,而是動態(tài)分配。
動態(tài)分配是指當一個系統(tǒng)進程或應用程序進程需要網(wǎng)絡通信時,它向主機申請一個端口,主機從可用的端口號中分配一個供它使用。
當這個進程關閉時,同時也就釋放了所占用的端口號。
3.3?怎樣查看端口??
用“netstat?-an”?“ps?-aux”查看端口狀態(tài)
4.?小總結
端口有什么用呢???我們知道,一臺擁有IP地址的主機可以提供許多服務,比如HTTP(萬維網(wǎng)服務)、FTP(文件傳輸)、SMTP(電子郵件)等,這些服務完全可以通過1個IP地址來實現(xiàn)。那么,主機是怎樣區(qū)分不同的網(wǎng)絡服務呢?顯然不能只靠IP地址,因為IP地址與網(wǎng)絡服務的關系是一對多的關系。實際上是通過“IP地址+端口號”來區(qū)分不同的服務的。?需要注意的是,端口并不是一一對應的。比如你的電腦作為客戶機訪問一臺WWW服務器時,WWW服務器使用“80”端口與你的電腦通信,但你的電腦則可能使用“3457”這樣的端口。
2.什么是IP地址
ip地址:用來在網(wǎng)絡中標記一臺電腦的一串數(shù)字,比如192.168.1.1;在本地局域網(wǎng)上是惟一的。
每一個IP地址包括兩部分:網(wǎng)絡地址和主機地址

這里的C類一般是小的局域網(wǎng)部分,網(wǎng)絡號都是相同的在同一網(wǎng)絡號上,一般能用的只有1-254個,因為255是廣播地址,如果寫0,那豈不還是表示當前的網(wǎng)絡號。
3.1?A類IP地址
一個A類IP地址由1字節(jié)的網(wǎng)絡地址和3字節(jié)主機地址組成,網(wǎng)絡地址的最高位必須是“0”,
地址范圍1.0.0.1-126.255.255.254
二進制表示為:00000001?00000000?00000000?00000001?-?01111110?11111111?11111111?11111110
可用的A類網(wǎng)絡有126個,每個網(wǎng)絡能容納1677214個主機
3.2?B類IP地址
一個B類IP地址由2個字節(jié)的網(wǎng)絡地址和2個字節(jié)的主機地址組成,網(wǎng)絡地址的最高位必須是“10”,
地址范圍128.1.0.1-191.255.255.254
二進制表示為:10000000?00000001?00000000?00000001?-?10111111?11111111?11111111?11111110
可用的B類網(wǎng)絡有16384個,每個網(wǎng)絡能容納65534主機
3.3?C類IP地址
一個C類IP地址由3字節(jié)的網(wǎng)絡地址和1字節(jié)的主機地址組成,網(wǎng)絡地址的最高位必須是“110”
范圍192.0.1.1-223.255.255.254
二進制表示為:?11000000?00000000?00000001?00000001?-?11011111?11111111?11111110?11111110
C類網(wǎng)絡可達2097152個,每個網(wǎng)絡能容納254個主機
3.4?D類地址用于多點廣播
D類IP地址第一個字節(jié)以“1110”開始,它是一個專門保留的地址。
它并不指向特定的網(wǎng)絡,目前這一類地址被用在多點廣播(Multicast)中
多點廣播地址用來一次尋址一組計算機
地址范圍224.0.0.1-239.255.255.254
3.5?E類IP地址
以“1111”開始,為將來使用保留
E類地址保留,僅作實驗和開發(fā)用
3.6?私有ip
在這么多網(wǎng)絡IP中,國際規(guī)定有一部分IP地址是用于我們的局域網(wǎng)使用,也就
是屬于私網(wǎng)IP,不在公網(wǎng)中使用的,它們的范圍是:
10.0.0.0~10.255.255.255
172.16.0.0~172.31.255.255
192.168.0.0~192.168.255.255
3.7?注意
IP地址127.0.0.1~127.255.255.255用于回路測試,
如:127.0.0.1可以代表本機IP地址,用http://127.0.0.1就可以測試本機中配置的Web服務器。
子網(wǎng)掩碼
要想理解什么是子網(wǎng)掩碼,就不能不了解IP地址的構成?;ヂ?lián)網(wǎng)是由許多小型網(wǎng)絡構成的,每個網(wǎng)絡上都有許多主機,這樣便構成了一個有層次的結構。IP地址在設計時就考慮到地址分配的層次特點,將每個IP地址都分割成網(wǎng)絡號和主機號兩部分,以便于IP地址的尋址操作。
IP地址的網(wǎng)絡號和主機號各是多少位呢?
如果不指定,就不知道哪些位是網(wǎng)絡號、哪些是主機號,這就需要通過子網(wǎng)掩碼來實現(xiàn)。
子網(wǎng)掩碼不能單獨存在,它必須結合IP地址一起使用。
子網(wǎng)掩碼只有一個作用,就是將某個IP地址劃分成網(wǎng)絡地址和主機地址兩部分子網(wǎng)掩碼的設定必須遵循一定的規(guī)則。
與IP地址相同,子網(wǎng)掩碼的長度也是32位,
左邊是網(wǎng)絡位,用二進制數(shù)字“1”表示;
右邊是主機位,用二進制數(shù)字“0”表示。
假設IP地址為“192.168.1.1”子網(wǎng)掩碼為“255.255.255.0”。
其中,“1”有24個,代表與此相對應的IP地址左邊24位是網(wǎng)絡號;
“0”有8個,代表與此相對應的IP地址右邊8位是主機號。
這樣,子網(wǎng)掩碼就確定了一個IP地址的32位二進制數(shù)字中哪些是網(wǎng)絡號、哪些是主機號。
這對于采用TCP/IP協(xié)議的網(wǎng)絡來說非常重要,只有通過子網(wǎng)掩碼,才能表明一臺主機所在的子網(wǎng)與其他子網(wǎng)的關系,使網(wǎng)絡正常工作。
最常用的兩種子網(wǎng)掩碼
子網(wǎng)掩碼是“255.255.255.0”的網(wǎng)絡:
最后面一個數(shù)字可以在0~255范圍內(nèi)任意變化,因此可以提供256個IP地址。
但是實際可用的IP地址數(shù)量是256-2,即254個,因為主機號不能全是“0”或全是“1”。
主機號全為0,表示網(wǎng)絡號
主機號全為1,表示網(wǎng)絡廣播
注意
如果將子網(wǎng)掩碼設置過大,也就是說子網(wǎng)范圍擴大,那么,根據(jù)子網(wǎng)尋徑規(guī)則,很可能發(fā)往和本地主機不在同一子網(wǎng)內(nèi)的目標主機的數(shù)據(jù),會因為錯誤的判斷而認為目標主機是在同一子網(wǎng)內(nèi),那么,數(shù)據(jù)包將在本子網(wǎng)內(nèi)循環(huán),直到超時并拋棄,使數(shù)據(jù)不能正確到達目標主機,導致網(wǎng)絡傳輸錯誤;如果將子網(wǎng)掩碼設置得過小,那么就會將本來屬于同一子網(wǎng)內(nèi)的機器之間的通信當做是跨子網(wǎng)傳輸,數(shù)據(jù)包都交給缺省網(wǎng)關處理,這樣勢必增加缺省網(wǎng)關(文章下方有解釋)的負擔,造成網(wǎng)絡效率下降。因此,子網(wǎng)掩碼應該根據(jù)網(wǎng)絡的規(guī)模進行設置。如果一個網(wǎng)絡的規(guī)模不超過254臺電腦,采用“255.255.255.0”作為子網(wǎng)掩碼就可以了,現(xiàn)在大多數(shù)局域網(wǎng)都不會超過這個數(shù)字,因此“255.255.255.0”是最常用的IP地址子網(wǎng)掩碼;假如在一所大學具有1500多臺電腦,這種規(guī)模的局域網(wǎng)可以使用“255.255.0.0”。
socket簡介
1.本地的進程間通信(IPC)有很多種方式,例如
隊列
同步(互斥鎖、條件變量等)
以上通信方式都是在一臺機器上不同進程之間的通信方式,那么問題來了
網(wǎng)絡中進程之間如何通信?
2.?網(wǎng)絡中進程之間如何通信
首要解決的問題是如何唯一標識一個進程,否則通信無從談起!
在本地可以通過進程PID來唯一標識一個進程,但是在網(wǎng)絡中這是行不通的。
其實TCP/IP協(xié)議族已經(jīng)幫我們解決了這個問題,網(wǎng)絡層的“ip地址”可以唯一標識網(wǎng)絡中的主機,而傳輸層的“協(xié)議+端口”可以唯一標識主機中的應用程序(進程)。
這樣利用ip地址,協(xié)議,端口就可以標識網(wǎng)絡的進程了,網(wǎng)絡中的進程通信就可以利用這個標志與其它進程進行交互
3.?什么是socket
socket(簡稱?套接字)?是進程間通信的一種方式,它與其他進程間通信的一個主要不同是:
它能實現(xiàn)不同主機間的進程間通信,我們網(wǎng)絡上各種各樣的服務大多都是基于?Socket?來完成通信的
例如我們每天瀏覽網(wǎng)頁、QQ?聊天、收發(fā)?email?等等
4.?創(chuàng)建socket
在?Python?中?使用socket?模塊的函數(shù)?socket?就可以完成:
socket.socket(AddressFamily,?Type)
說明:
函數(shù)?socket.socket?創(chuàng)建一個?socket,返回該?socket?的描述符,該函數(shù)帶有兩個參數(shù):
Address?Family:可以選擇?AF_INET(用于?Internet?進程間通信)?或者?AF_UNIX(用于同一臺機器進程間通信),實際工作中常用AF_INET
Type:套接字類型,可以是?SOCK_STREAM(流式套接字,主要用于?TCP?協(xié)議)或者?SOCK_DGRAM(數(shù)據(jù)報套接字,主要用于?UDP?協(xié)議)
創(chuàng)建一個tcp?socket(tcp套接字)
UDP介紹
UDP?---?用戶數(shù)據(jù)報協(xié)議,是一個無連接的簡單的面向數(shù)據(jù)報的運輸層協(xié)議。UDP不提供可靠性,它只是把應用程序傳給IP層的數(shù)據(jù)報發(fā)送出去,但是并不能保證它們能到達目的地。由于UDP在傳輸數(shù)據(jù)報前不用在客戶和服務器之間建立一個連接,且沒有超時重發(fā)等機制,故而傳輸速度很快。
UDP是一種面向無連接的協(xié)議,每個數(shù)據(jù)報都是一個獨立的信息,包括完整的源地址或目的地址,它在網(wǎng)絡上以任何可能的路徑傳往目的地,因此能否到達目的地,到達目的地的時間以及內(nèi)容的正確性都是不能被保證的。
UDP特點:
UDP是面向無連接的通訊協(xié)議,UDP數(shù)據(jù)包括目的端口號和源端口號信息,由于通訊不需要連接,所以可以實現(xiàn)廣播發(fā)送。?UDP傳輸數(shù)據(jù)時有大小限制,每個被傳輸?shù)臄?shù)據(jù)報必須限定在64KB之內(nèi)。?UDP是一個不可靠的協(xié)議,發(fā)送方所發(fā)送的數(shù)據(jù)報并不一定以相同的次序到達接收方。
【適用情況】
UDP是面向消息的協(xié)議,通信時不需要建立連接,數(shù)據(jù)的傳輸自然是不可靠的,UDP一般用于多點通信和實時的數(shù)據(jù)業(yè)務,比如
語音廣播
視頻
TFTP(簡單文件傳送)
SNMP(簡單網(wǎng)絡管理協(xié)議)
RIP(路由信息協(xié)議,如報告股票市場,航空信息)
DNS(域名解釋)
注重速度流暢
UDP操作簡單,而且僅需要較少的監(jiān)護,因此通常用于局域網(wǎng)高可靠性的分散系統(tǒng)中client/server應用程序。例如視頻會議系統(tǒng),并不要求音頻視頻數(shù)據(jù)絕對的正確,只要保證連貫性就可以了,這種情況下顯然使用UDP會更合理一些。
udp網(wǎng)絡程序-發(fā)送數(shù)據(jù)
socket函數(shù)
mySocket?=?socket(family,?type)
函數(shù)socket()的參數(shù)family用于設置網(wǎng)絡通信的域,函數(shù)socket()根據(jù)這個參數(shù)選擇通信協(xié)議的族。通信協(xié)議族在文件sys/socket.h中定義。

函數(shù)socket()的參數(shù)type用于設置套接字通信的類型,主要有SOCKET_STREAM(流式套接字)、SOCK——DGRAM(數(shù)據(jù)包套接字)等。
并不是所有的協(xié)議族都實現(xiàn)了這些協(xié)議類型,例如,AF_INET協(xié)議族就沒有實現(xiàn)SOCK_SEQPACKET協(xié)議類型。

創(chuàng)建一個udp客戶端程序的流程是簡單,具體步驟如下:
1:創(chuàng)建客戶端套接字
2:發(fā)送/接收數(shù)據(jù)
3:關閉套接字
一:文件發(fā)消息

二:文件收消息

結果是:

三:接收發(fā)送消息,回復默認值OK

結果是:

四:模擬服務器

結果是:

不過這樣只能一次回復一個人,也就是說,只能一次一次的工作,可以用多線程來實現(xiàn)這項工作
五:多線程模擬服務器

udp廣播
TCP/IP協(xié)議棧中,?傳輸層只有UDP可以廣播.
點擊鏈接查看廣播的計算方法
點擊鏈接查看在線網(wǎng)絡計算器

運用broadcast來實現(xiàn)

udp總結
1.?udp是TCP/IP協(xié)議族中的一種協(xié)議能夠完成不同機器上的程序間的數(shù)據(jù)通信
2.?udp服務器、客戶端
udp的服務器和客戶端的區(qū)分:往往是通過請求服務和提供服務來進行區(qū)分
請求服務的一方稱為:客戶端
提供服務的一方稱為:服務器
3.?udp綁定問題
一般情況下,服務器端,需要綁定端口,目的是為了讓其他的客戶端能夠正確發(fā)送到此進程
客戶端,一般不需要綁定,而是讓操作系統(tǒng)隨機分配,這樣就不會因為需要綁定的端口被占用而導致程序無法運行的情況
tcp相關介紹
udp通信模型
udp通信模型中,在通信開始之前,不需要建立相關的鏈接,只需要發(fā)送數(shù)據(jù)即可,類似于生活中,"寫信”
tcp通信模型
tcp通信模型中,在通信開始之前,一定要先建立相關的鏈接,才能發(fā)送數(shù)據(jù),類似于生活中,"打電話"
tcp服務器
如同上面的電話機過程一樣,在程序中,如果想要完成一個tcp服務器的功能,需要的流程如下:
socket創(chuàng)建一個套接字
bind綁定ip和port
listen使套接字變?yōu)榭梢员粍渔溄?/p>
accept等待客戶端的鏈接
recv/send接收發(fā)送數(shù)據(jù)
一個很簡單的tcp服務器如下:
一:tcp收消息

二:tcp發(fā)消息
