学习笔记(二十)—— 网络编程
文章目錄
- 一、網絡通信概述
- 1.1、什么是網絡
- 1.2、使用網絡的目的
- 二、TCP/IP簡介
- 2.1、什么是協議
- 2.2、計算機網絡溝通
- 三、端口和端口號
- 3.1、什么是端口
- 3.2、端口號
- 3.3、端口分配
- 3.3.1、知名端口(WellKnownPorts)
- 3.3.2、動態端口(DynamicPorts)
- 3.4、端口作用
- 四、ip地址
- 4.1、什么是ip地址
- 4.2、ip地址的作用
- 4.3、ip地址的分類
- 4.3.1、A類IP地址
- 4.3.2、B類IP地址
- 4.3.3、C類IP地址
- 4.3.4、D類地址用于多點廣播
- 4.3.5、E類IP地址
- 4.3.6、私有ip
- 4.3.7、注意
- 4.4、子網掩碼
- 五、TCP和UDP
- 5.1、TCP(傳輸控制協議)
- 5.1.1、TCP三次握手過程
- 5.1.2、TCP四次揮手
- 5.2、UDP(用戶數據報協議)
- 5.3、TCP協議與UDP協議的區別
- 六、socket簡介
- 6.1、什么是socket
- 6.2、創建socket
- 6.3、小案例:客戶端和服務端通信
一、網絡通信概述
1.1、什么是網絡
網絡就是一種輔助雙方或者多方能夠連接在一起的工具,如果沒有網絡可想,單機的世界是多么的孤單。
1.2、使用網絡的目的
就是為了聯通多方然后進行通信用的,即把數據從一方傳遞給另外一方。單機的程序,即不能和其他電腦上的程序進行通信,為了讓在不同的電腦上運行的軟件,之間能夠互相傳遞數據,就需要借助網絡的功能。
總結:使用網絡能夠把多方鏈接在一起,然后可以進行數據傳遞。所謂的網絡編程就是,讓在不同的電腦上的軟件能夠進行數據傳遞,即進程之間的通信。
二、TCP/IP簡介
作為新時代標桿的我們,已經離不開手機、離不開網絡,對于互聯網大家可能耳熟能詳,但是計算機網絡的出現比互聯網要早很多.
2.1、什么是協議
有的說英語,有的說中文,有的說德語,說同一種語言的人可以交流,不同的語言之間就不行了。為了解決不同種族人之間的語言溝通障礙,現規定國際通用語言是英語,這就是一個規定,這就是協議。
2.2、計算機網絡溝通
計算機網絡溝通用什么?現在的生活中,不同的計算機只需要能夠聯網(有線無線都可以)那么就可以相互進行傳遞數據。
那么不同種類之間的計算機到底是怎么進行數據傳遞的呢?就像說不同語言的人溝通一樣,只要有一種大家都認可都遵守的協議即可,那么這個計算機都遵守的網絡通信協議叫做TCP/IP協議。
早期的計算機網絡,都是由各廠商自己規定一套協議,IBM、Apple和Microsoft都有各自的網絡協議,互不兼容,為了把全世界的所有不同類型的計算機都連接起來,就必須規定一套全球通用的協議,為了實現互聯網這個目標,互聯網協議簇(InternetProtocolSuite)就是通用協議標準。
因為互聯網協議包含了上百種協議標準,但是最重要的兩個協議是TCP和IP協議,所以,大家把互聯網的協議簡稱TCP/IP協議。
常用的網絡協議如下圖所示:
說明:網際層也稱為網絡層,網絡接口層也稱為鏈路層
三、端口和端口號
3.1、什么是端口
TCP/IP協議中的端口指的是什么呢?端口就好一個房子的,是出入這間房子的必經之路。如果一個進程需要收發網絡數據,那么就需要有這樣的端口在linux系統中,端口可以有65536(2的16次方)個之多!既然有這么多,操作系統為了統一管理,所以進行了編號,這就是端口號。
3.2、端口號
端口是通過端口號來標記的,端口號只有整數,范圍是從0~65535
3.3、端口分配
端口是怎樣分配的?端口號不是隨意使用的,而是按照一定的規定進行分配。端口的分類標準有好幾種,我們這里不做詳細講解,只介紹一下知名端口和動態端口。
3.3.1、知名端口(WellKnownPorts)
知名端口是眾所周知的端口號,范圍從0到1023,( 80端口分配給HTTP服務,21端口分配給FTP服務)可以理解為,一些常用的功能使用的號碼是估計的,好比電話號碼110、10086、10010一樣
3.3.2、動態端口(DynamicPorts)
動態端口的范圍是從1024到65535之所以稱為動態端口,是因為它一般不固定分配某種服務,而是動態分配。動態分配是指當一個系統進程或應用程序進程需要網絡通信時,它向主機申請一個端口,主機從可用的端口號中分配一個供它使用。當這個進程關閉時,同時也就釋放了所占用的端口號。
3.4、端口作用
端口有什么用?我們知道,一臺擁有IP地址的主機可以提供許多服務,比如HTTP(萬維網服務)、FTP(文件傳輸)、SMTP(電子郵件)等,這些服務完全可以通過1個IP地址來實現。那么,主機是怎樣區分不同的網絡服務呢?顯然不能只靠IP地址,因為IP地址與網絡服務的關系是一對多的關系。實際上是通過“IP地址+端口號”來區分不同的服務的。
需要注意的:端口并不是一一對應的。比如你的電腦作為客戶機訪問一臺WWW服務器時,WWW服務器使用“80”端口與你的電腦通信,但你的電腦則可能使用“3457”這樣的端口。
四、ip地址
4.1、什么是ip地址
IP 地址是指互聯網協議地址,又譯為網際協議地址。IP 地址是IP協議提供的一種統一的地址格式,它為互聯網上的每一個網絡和每一臺主機分配一個邏輯地址,以此來屏蔽物理地址的差異。
ip地址:用來在網絡中標記一臺電腦的一串數字,比如192.168.1.1;在本地局域網上是惟一的
4.2、ip地址的作用
IP地址用于標識主機的地址,一個網絡是由若干臺主機組成的,每臺主機必須有一個全球唯一的IP地址,就像我們的生活中的電話號碼一樣,每部電話只能有一個全球唯一的電話號碼。廣義上的主機可以是工作在網絡中的工作站、服務器、路由器。IP地址一般是用十進制來表示的。由四個數字段來組成,中間用逗號隔開。如192.168.1.5就是一個IP地址。
4.3、ip地址的分類
每一個IP地址包括兩部分:網絡地址和主機地址
IP地址分為五類,A類保留給政府機構,B類分配給中等規模的公司,C類分配給任何需要的人,D類用于組播,E類用于實驗
4.3.1、A類IP地址
一個A類IP地址由1字節(8位)的網絡地址和3字節(24位)主機地址組成,網絡地址的最高位必須是“0”
地址范圍:
1.0.0.1——126.255.255.254二進制表示為:
00000001 00000000 00000000 00000001——01111110 11111111 11111111 11111110可用的A類網絡有126個,每個網絡能容納1677214個主機
4.3.2、B類IP地址
一個B類IP地址由2個字節的網絡地址和2個字節的主機地址組成,網絡地址的最高位必須是“10”
地址范圍:
二進制表示為:
10000000 00000001 00000000 00000001—— 10111111 11111111 11111111 11111110可用的B類網絡有16384個,每個網絡能容納65534主機
4.3.3、C類IP地址
一個C類IP地址由3字節的網絡地址和1字節的主機地址組成,網絡地址的最高位必須是“110”
范圍:
192.0.1.1-223.255.255.254二進制表示為:
11000000 00000000 00000001 00000001- 11011111 11111111 11111110 11111110C類網絡可達2097152個,每個網絡能容納254個主機
4.3.4、D類地址用于多點廣播
D類IP地址第一個字節以“1110”開始,它是一個專保留的地址。它并不指向特定的網絡,目前這一類地址被用在多點廣播(Multicast)中多點廣播地址用來一次尋址一組計算機地址范圍:224.0.0.1-239.255.255.254
4.3.5、E類IP地址
以“1111”開始,為將來使用保留E類地址保留,僅作實驗和開發用
4.3.6、私有ip
在這么多網絡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.2554.3.7、注意
IP地址127.0.0.1~127.255.255.255用于回路測試,如:127.0.0.1可以代表本機IP地址,用http://127.0.0.1就可以測試本機中配置的Web服務器
4.4、子網掩碼
要想理解什么是子網掩碼,就不能不了解IP地址的構成?;ヂ摼W是由許多小型網絡構成的,每個網絡上都有許多主機,這樣便構成了一個有層次的結構。IP地址在設計時就考慮到地址分配的層次特點,將每個IP地址都分割成網絡號和主機號兩部分,以便于IP地址的尋址操作。
IP地址的網絡號和主機號各是多少位呢?
如果不指定,就不知道哪些位是網絡號、哪些是主機號,這就需要通過子網掩碼來實現。子網掩碼不能單獨存在,它必須結合IP地址一起使用。子網掩碼只有一個作用,就是將某個IP地址劃分成網絡地址和主機地址兩部分子網掩碼的設定必須遵循一定的規則。與IP地址相同,子網掩碼長度也是32位,左邊是網絡位,用二進制數字“1”表示;右邊是主機位,用二進制數字“0”表示。
假設IP地址為“192.168.1.1”,子網掩碼為“255.255.255.0”。其中,“1”有24個,代表與此相對應的IP地址左邊24位是網絡號;“0”有8個,代表與此相對應的IP地址右邊8位是主機號。這樣,子網掩碼就確定了一個IP地址的32位二進制數字中哪些是網絡號、哪些是主機號。這對于采用TCP/IP協議的網絡來說非常重要,只有通過子網掩碼,才能表明一臺主機所在的子網。
五、TCP和UDP
5.1、TCP(傳輸控制協議)
TCP(TransmissionControlProtocol,傳輸控制協議)是面向連接的協議,也就是說,在收發數據前,必須和對方建立可靠的連接。一個TCP連接必須要經過三次“對話”才能建立起來,其中的過程非常復。
TCP建立連接要進行3次握手,而斷開連接要進行4次。
5.1.1、TCP三次握手過程
第一次握手:主機A通過向主機B發送一個含有同步序列號的標志位的數據段給主機B,向主機B請求建立連接,通過這個數據段,主機A告訴主機B兩件事:我想要和你通信;你可以用哪個序列號作為起始數據段來回應我。
第二次握手:主機B收到主機A的請求后,用一個帶有確認應答(ACK)和同步序列號(SYN)標志位的數據段響應主機A,也告訴主機A兩件事:我已經收到你的請求了,你可以傳輸數據了;你要用那個序列號作為起始數據段來回應我。
第三次握手:主機A收到這個數據段后,再發送一個確認應答,確認已收到主機B的數據段:"我已收到回復,我現在要開始傳輸實際數據了,這樣3次握手就完成了,主機A和主機B就可以傳輸數據了。
3次握手的特點
沒有應用層的數據,SYN這個標志位只有在TCP建立連接時才會被置1握手完成后SYN標志位被置0。
5.1.2、TCP四次揮手
第一次:當主機A完成數據傳輸后,將控制位FIN置1,提出停止TCP連接的請求;
第二次:主機B收到FIN后對其作出響應,確認這一方向上的TCP連接將關閉,將ACK置1;
第三次:由B端再提出反方向的關閉請求,將FIN置1;
第四次:主機A對主機B的請求進行確認,將ACK置1,雙方向的關閉結束.。
由TCP的三次握手和四次斷開可以看出,TCP使用面向連接的通信方式,大大提高了數據通信的可靠性,使發送數據端和接收端在數據正式傳輸前就有了交互,為數據正式傳輸打下了可靠的基礎。
5.2、UDP(用戶數據報協議)
UDP是一個非連接的協議,傳輸數據之前源端和終端不建立連接,當它想傳送時就簡單地去抓取來自應用程序的數據,并盡可能快地把它扔到網絡上。在發送端,UDP傳送數據的速度僅僅是受應用程序生成數據的速度、計算機的能力和傳輸帶寬的限制;在接收端,UDP把每個消息段放在隊列中,應用程序每次從隊列中讀一個消息段。
由于傳輸數據不建立連接,因此也就不需要維護連接狀態,包括收發狀態等,因此一臺服務機可同時向多個客戶機傳輸相同的消息。
UDP信息包的標題很短,只有8個字節,相對于TCP的20個字節信息包的額外開銷很小。
吞吐量不受擁擠控制算法的調節,只受應用軟件生成數據的速率、傳輸帶寬、源端和終端主機性能的限制。
UDP使用盡最大努力交付,即不保證可靠交付,因此主機不需要
5.3、TCP協議與UDP協議的區別
首先咱們弄清楚,TCP協議和UDP協議與TCP/IP協議的聯系,很多人犯糊涂了TCP/IP協議是一個協議簇。里面包括很多協議的,UDP只是其中的一個,之所以命名為TCP/IP協議,因為TCP、IP協議是兩個很重要的協議,就用他兩命名了。
TCP/IP協議集包括應用層,傳輸層,網絡層,網絡訪問層。
TCP協議和UDP協議的區別有以下幾個:
六、socket簡介
6.1、什么是socket
socket(簡稱套接字)是進程間通信的一種方式,它能實現不同主機間的進程間通信,我們網絡上各種各樣的服務大多都是基于Socket來完成通信的。例如我們每天瀏覽網、QQ聊天、收發email等等。
我們深諳信息交流的價值,那網絡中進程之間如何通信,如我們每天打開瀏覽器瀏覽網頁時,瀏覽器的進程怎么與web服務器通信的?當你用QQ聊天時,QQ進程怎么與服務器或你好友所在的QQ進程通信?這些都得靠socket。
socket起源于UNIX,在Unix一切皆文件哲學的思想下,socket是一種"打開—讀/寫—關閉"模式的實現,服務器和客戶端各自維護一個"文件",在建立連接打開后,可以向自己文件寫入內容供對方讀取或者讀取對方內容,通訊結束時關閉文件。
6.2、創建socket
在Python中使用socket模塊的函數socket就可以完成:
socket.socket(AddressFamily,Type)說明:函數socket.socket創建一個socket,返回該socket的描述符,該函數帶有兩個參數:
AddressFamily:可以選擇AF_INET(用于Internet進程間通信)或者AF_UNIX(用于同一臺機器進程間通信),實際工作中常用AF_INET。
Type:套接字類型,可以是SOCK_STREAM(流式套接字,主要用于TCP協議)或者SOCK_DGRAM(數據報套接字,主要用于UDP協議)。
創建一個tcpsocket(tcp套接字)
import sockets = socket.socket(socket.AF_INET,socket.SOCK_STREAM) print('Socket Created')創建一個udpsocket(udp套接字)
import sockets = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) print('Socket Created')6.3、小案例:客戶端和服務端通信
客戶端:
import socketclient = socket.socket() #生成socket連接對象 client.connect(('127.0.0.1',6969)) #和目標主機建立連接、 client.send('我是客戶端,收到請回答!!'.encode()) #想服務器發送數據 client.close()服務端:
import socketserver = socket.socket()server.bind(('127.0.0.1',6969)) #綁定監聽對象 server.listen() #監聽 print('===準備===') conn,addr = server.accept() #等待消息 print(f'conn:{conn} \naddr:{addr}') data = conn.recv(1024) print('接受到的數據:',data.decode()) server.close()結果(服務端):
===準備=== conn:<socket.socket fd=516, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 6969), raddr=('127.0.0.1', 21545)> addr:('127.0.0.1', 21545) 接受到的數據: 我是客戶端,收到請回答!!總結
以上是生活随笔為你收集整理的学习笔记(二十)—— 网络编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 爬虫学习笔记(二十四)—— pyspid
- 下一篇: 学习笔记(二十二)—— 了解进程和线程