咱們都有使用QQ的經歷, 咱們想要給咱們的朋友發一個消息你好啊!
, 這個消息是怎麼到達朋友的電腦上的呢? 而ip地址的做用這個時候就體現出來了. 接下來咱們先來了解一下!linux
下面是一個局域網的網絡拓撲圖, 咱們想要從李四的電腦上發個來吃完飯
的消息給到張三, 須要進過一層一層的到達, 以下圖bash
用來在網絡中標記一臺電腦,好比192.168.1.1;在本地局域網上是惟一的服務器
若是咱們處於同一個局域網中, 可能咱們的地址是192.168.33.xx
, 其中192.168.33
就是網絡號, xx
就是主機號, 也就是咱們每一臺電腦就至關於一臺主機, 若是咱們之間想要通訊, 這個網絡號必須相同, 主機號不能夠相同. 前面表示相同的網絡, 後面表示不一樣的主機, 理論上來講在同一個網絡下, 咱們可以使用的範圍是0~255也就是256個地址, 但這裏要說一下最大的和最小的不能夠用, 也就是說192.168.33.0
和192.168.33.255
這兩個地址不能夠用. 因此在同一網絡中最多容納254臺ipz地址主機微信
但實際狀況是, 最後一位做爲主機號並不可以知足當前網絡的使用需求, 因此就有多是這樣192.168
做爲網絡號, 然後面的做爲主機號, 這樣就能夠知足 256*256臺主機. 而咱們的A類B類C類就是這樣來的. 根據未來咱們的網絡中主機的使用個數, 進行劃分網絡
每個IP地址包括兩部分:網絡地址和主機地址socket
一個A類IP地址由1字節的網絡地址和3字節主機地址組成,網絡地址的最高位必須是「0」,地址範圍1.0.0.1-126.255.255.254, 二進制表示爲:00000001 00000000 00000000 00000001 - 01111110 11111111 11111111 11111110, 可用的A類網絡有126個,每一個網絡能容納1677214個主機tcp
一個B類IP地址由2個字節的網絡地址和2個字節的主機地址組成,網絡地址的最高位必須是「10」,地址範圍128.1.0.1-191.255.255.254, 二進制表示爲:10000000 00000001 00000000 00000001 - 10111111 11111111 11111111 11111110, 可用的B類網絡有16384個,每一個網絡能容納65534主機工具
一個C類IP地址由3字節的網絡地址和1字節的主機地址組成,網絡地址的最高位必須是「110」, 範圍192.0.1.1-223.255.255.254, 二進制表示爲: 11000000 00000000 00000001 00000001 - 11011111 11111111 11111110 11111110, C類網絡可達2097152個,每一個網絡能容納254個主機oop
D類地址用於多點廣播(單播, 多播, 廣播)測試
D類IP地址第一個字節以「1110」開始,它是一個專門保留的地址。它並不指向特定的網絡,目前這一類地址被用在多點廣播(Multicast)中, 多點廣播地址用來一次尋址一組計算機 s 地址範圍224.0.0.1-239.255.255.254
以「1111」開始,爲未來使用保留, E類地址保留,僅做實驗和開發用
在這麼多網絡IP中,國際規定有一部分IP地址是用於咱們的局域網使用,也就是屬於私網IP,不在公網中使用的,它們的範圍是:
10.0.0.0~10.255.255.255
172.16.0.0~172.31.255.255
192.168.0.0~192.168.255.255
複製代碼
IP地址127.0.0.1 ~ 127.255.255.255用於迴路測試
咱們使用ifconfg
來查看當前的地址
xxzxdeMacBook-Pro:~ xxzx$ ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
options=1203<RXCSUM,TXCSUM,TXSTATUS,SW_TIMESTAMP>
inet 127.0.0.1 netmask 0xff000000
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
nd6 options=201<PERFORMNUD,DAD>
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
stf0: flags=0<> mtu 1280
XHC20: flags=0<> mtu 0
en1: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
options=60<TSO4,TSO6>
ether 4a:00:07:62:ce:40
media: autoselect <full-duplex>
status: inactive
en2: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
options=60<TSO4,TSO6>
ether 4a:00:07:62:ce:41
media: autoselect <full-duplex>
status: inactive
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether c4:b3:01:cb:53:97
inet6 fe80::1898:be0b:d499:475c%en0 prefixlen 64 secured scopeid 0x7
inet 10.75.20.81 netmask 0xffffff00 broadcast 10.75.20.255
nd6 options=201<PERFORMNUD,DAD>
media: autoselect
status: active
bridge0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=63<RXCSUM,TXCSUM,TSO4,TSO6>
ether 4a:00:07:62:ce:40
Configuration:
id 0:0:0:0:0:0 priority 0 hellotime 0 fwddelay 0
maxage 0 holdcnt 0 proto stp maxaddr 100 timeout 1200
root id 0:0:0:0:0:0 priority 0 ifcost 0 port 0
ipfilter disabled flags 0x2
member: en1 flags=3<LEARNING,DISCOVER>
ifmaxaddr 0 port 5 priority 0 path cost 0
member: en2 flags=3<LEARNING,DISCOVER>
ifmaxaddr 0 port 6 priority 0 path cost 0
nd6 options=201<PERFORMNUD,DAD>
media: <unknown type>
status: inactive
p2p0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 2304
ether 06:b3:01:cb:53:97
media: autoselect
status: inactive
awdl0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1484
ether ba:49:5e:fc:11:b4
inet6 fe80::b849:5eff:fefc:11b4%awdl0 prefixlen 64 scopeid 0xa
nd6 options=201<PERFORMNUD,DAD>
media: autoselect
status: active
utun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 2000
inet6 fe80::26d5:7b0:7285:d2ae%utun0 prefixlen 64 scopeid 0xb
nd6 options=201<PERFORMNUD,DAD>
utun1: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1380
inet6 fe80::5ec1:8b8b:17f5:a0ba%utun1 prefixlen 64 scopeid 0xc
nd6 options=201<PERFORMNUD,DAD>
utun2: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1380
inet6 fe80::955e:295d:2d4b:9867%utun2 prefixlen 64 scopeid 0xd
nd6 options=201<PERFORMNUD,DAD>
en4: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether 86:a1:34:5f:4d:5d
inet6 fe80::18d7:5ae1:41e6:f72f%en4 prefixlen 64 secured scopeid 0xe
inet 169.254.128.31 netmask 0xffff0000 broadcast 169.254.255.255
nd6 options=201<PERFORMNUD,DAD>
media: autoselect (100baseTX <full-duplex>)
status: active
複製代碼
在Mac電腦中會展現如上內容, 其中有一個en0
裏面就包含咱們所要查看ip地址, 那其餘的都是些什麼呢
lo0 = loopback
gif0 = Software Network Interface
stf0 = 6to4 tunnel interface
en0 = Ethernet 0
fw0 = Firewire
en1 = Ethernet 1
vmnet1 = Virtual Interface
複製代碼
咱們使用命令networksetup -listallhardwareports
查看一下, 能夠知道是一些硬件信息, 好比USB接口, 藍牙, 雷電口等
xxzxdeMacBook-Pro:~ xxzx$ networksetup -listallhardwareports
Hardware Port: iPhone USB
Device: en4
Ethernet Address: 86:a1:34:5f:4d:5d
Hardware Port: Wi-Fi
Device: en0
Ethernet Address: c4:b3:01:cb:53:97
Hardware Port: Bluetooth PAN
Device: en3
Ethernet Address: c4:b3:01:cb:53:98
Hardware Port: Thunderbolt 1
Device: en1
Ethernet Address: 4a:00:07:62:ce:40
Hardware Port: Thunderbolt 2
Device: en2
Ethernet Address: 4a:00:07:62:ce:41
Hardware Port: Thunderbolt Bridge
Device: bridge0
Ethernet Address: 4a:00:07:62:ce:40
VLAN Configurations
===================
複製代碼
xxzxdeMacBook-Pro:~ xxzx$ sudo ifconfig en0 down
Password:
xxzxdeMacBook-Pro:~ xxzx$ sudo ifconfig en0 up
複製代碼
上面咱們介紹了什麼是ip地址. 咱們知道如今咱們能夠經過ip地址去找到對應的主機. 一樣咱們以聊天工具QQ爲例, 咱們從一臺電腦發送一條消息到另外一臺電腦. 咱們知道這個消息能夠經過ip地址到達這臺目標電腦, 可是咱們的電腦是怎麼知道這個消息是發送給什麼應用呢. 是發給QQ仍是微信或者是釘釘呢. 這個時候咱們就引伸出端口
這個概念.
若是一個程序須要收發網絡數據,那麼就須要有這樣的端口在linux系統中,端口能夠有65536(2的16次方)個之多!既然有這麼多,操做系統爲了統一管理,因此進行了編號,這就是端口號
端口是經過端口號來標記的,端口號只有整數,範圍是從0到65535
注意:端口數不同的*nix系統不同,還能夠手動修改
端口號不是隨意使用的,而是按照必定的規定進行分配。
80端口分配給HTTP服務
21端口分配給FTP服務
複製代碼
咱們能夠理解成, 一些經常使用的功能使用的號碼是估計的,比如 電話號碼1十、1008六、10010同樣, 通常狀況下,若是一個程序須要使用知名端口的須要有root權限
動態端口的範圍是從1024到65535, 之因此稱爲動態端口,是由於它通常不固定分配某種服務,而是動態分配。
動態分配是指當一個系統程序或應用程序程序須要網絡通訊時,它向主機申請一個端口,主機從可用的端口號中分配一個供它使用。
當這個程序關閉時,同時也就釋放了所佔用的端口號
端口有什麼用呢 ? 咱們知道,一臺擁有IP地址的主機能夠提供許多服務,好比HTTP(萬維網服務)、FTP(文件傳輸)、SMTP(電子郵件)等,這些服務徹底能夠經過1個IP地址來實現。那麼,主機是怎樣區分不一樣的網絡服務呢?顯然不能只靠IP地址,由於IP地址與網絡服務的關係是一對多的關係。其實是經過「IP地址+端口號」來區分不一樣的服務的。 須要注意的是,端口並非一一對應的。好比你的電腦做爲客戶機訪問一臺WWW服務器時,WWW服務器使用「80」端口與你的電腦通訊,但你的電腦則可能使用「3457」這樣的端口。
首要解決的問題是如何惟一標識一個進程,不然通訊無從談起!
在1臺電腦上能夠經過進程號(PID)來惟一標識一個進程,可是在網絡中這是行不通的。
其實TCP/IP協議族已經幫咱們解決了這個問題,網絡層的「ip地址」能夠惟一標識網絡中的主機,而傳輸層的「協議+端口」能夠惟一標識主機中的應用進程(進程)。
這樣利用ip地址,協議
,端口就能夠標識網絡的進程了,網絡中的進程通訊就能夠利用這個標誌與其它進程進行交互
socket(簡稱 套接字) 是進程間通訊的一種方式,它與其餘進程間通訊的一個主要不一樣是:
它能實現不一樣主機間的進程間通訊,咱們網絡上各類各樣的服務大多都是基於 Socket 來完成通訊的
例如咱們天天瀏覽網頁、QQ 聊天、收發 email 等等
套接字是一個能夠同時收發數據的分別是:
單工
, 指的是隻能向一個方向走, 好比收音機, 咱們就只能聽半雙工
, 好比對講機, 能夠收也能夠發, 可是發的時候收不了, 收的時候發不了全雙工
, 同一時刻能夠同時收和發, 好比打電話. 能夠邊聽邊說