咱們使用qq、微信和別人聊天,經過瀏覽器來瀏覽頁面、看京東的網站,經過優酷、快播(此處只是懷念一下)看片片啥的等等,經過無線打印機來打印一個word文檔等,只要有無線、有網、有4G,咱們就能好好的聊天,好好的看片片、好好的購物什麼的,對吧,那麼這些操做都叫作網絡通訊,確切來講都須要使用網絡通訊,前提是你要有網(你們記着這個'網',我下面會給你們詳解),原來生活中到處使用了網絡通訊,咱們經過網絡通訊的不一樣形式:好比說qq是咱們下載到電腦或者手機上的應用程序(qq應用程序就是人家騰訊開發的軟件,放到你的電腦或者手機上供你使用的,大概明白應用程序意思就行,不用深究~~),瀏覽器也是咱們下載的應用程序,可是瀏覽器是經過頁面來訪問別人的網站的,而打印機我是經過我電腦上的word來操做使用的。根據這些不一樣的場景或者說不用的溝通方式,在業內劃分了下面兩個架構(架構:就是不一樣的組成結構)。在看下面的幾個架構以前,咱們須要知道什麼是客戶端,什麼是服務端。客戶端:安裝在你電腦上的qq,瀏覽器(360瀏覽器、chrome瀏覽器、IE瀏覽器等),當咱們使用qq發送消息的時候,消息先發送到了騰訊,而後騰訊在轉發到你朋友的qq上,此時你的qq就是客戶端,騰訊就是服務端。當咱們使用瀏覽器來看京東的網站的時候,咱們電腦上的瀏覽器就叫作客戶端,京東就叫作服務端。前端
客戶端英文名稱:Client(使用服務端的服務),服務端英文名稱:Server(一直運行着,等待服務別人,不能有一天訪問百度,百度頁面打不開,不行吧。),下面所說的C\S架構就是說的Client\Server架構。web
a.硬件C\S架構:打印機。chrome
b.軟件C\S架構:QQ、微信、優酷、暴風影音、瀏覽器(IE、火狐,360瀏覽器等)。其中瀏覽器又比較特殊,不少網站是基於瀏覽器來進行訪問的,瀏覽器和各個網站服務端進行的通信方式又常被成爲B\S架構(瀏覽器英文名稱:Browser),web開發就是這個,後面你們知道有前端的課程對吧,前端就是瀏覽器上的知識,之後你會常常和瀏覽器打交道,學完前端就能夠進行web開發全棧開發了。若是我把全部的東西都作成應用程序是否是很麻煩啊,要裝不少的軟件對吧,全部就開始有了B\S架構,只須要個瀏覽器就能使用不少的工具了,而且提供了一個統一入口,這也是爲何B\S架構火了起來。可是手機端的仍是用的應用程序多一些,可是手機端B\S架構也是一個趨勢,就像微信的小程序和公衆號,爲何說是一個趨勢呢,不只僅是由於方便由於省錢,而是提供了一個統一的入口,其實微信早就實現了。統一入口是什麼意思呢?就像咱們公司常常用的一個公司內部管理系統,請假、打卡、報銷、查客戶等等,若是這些功能都須要打開一個網頁或者app,是否是很難受啊,那麼公司就作了這麼一個系統,你們在這個系統上關於上班的一些你須要的功能就都能完成了,這就是統一入口。這也是一個開發思想,大程序分紅幾個小程序,開發速度也快,開發一個小功能就能上線,而不須要等着全部的功能所有開發完成才上線,解耦分治思想,公司作開發時這種思想很流行,迭代開發。小程序
無論哪一個架構,他們都要進行網絡通訊,基本都要用socket,咱們學習socekt就是爲了完成C\S架構項目的開發瀏覽器
網關:緩存
網關是一種充當轉換重任的計算機系統或設備。安全
與網橋只是簡單地傳達信息不一樣,網關對收到的信息要從新打包,以適應目的系統的需求。同時,網關也能夠提供過濾和安全功能。具體功能主要體如今如下幾個方面:服務器
1.具備協議轉換功能。微信
2.具備流量控制和擁塞控制的能力。網絡
3.具備在各個網絡之間可靠傳送信息的能力。
4.具備路由選擇功能。
5.具備將分組分段和組裝的能力。
集線器:
集線器的主要功能是對接收到的信號進行再生放大,以擴大網絡的傳輸距離,同時把全部節點集中在以它爲中心的節點上。集線器只是一個信號放大和中轉的設備,它不具有交換功能。集線器能與網絡中的打印服務器、交換機、文件服務器或其餘的設備鏈接。它是一個標準的共享設備,不具有定向傳送信號的能力
DNS過程
端口+IP可以肯定一臺電腦上的某一個應用程序~~
那麼咱們經過下面的代碼簡單看一下socket究竟是個什麼樣子,大概怎麼使用:下面的程序就是一個應用程序,和qq啊、微信啊是同樣的,都叫作應用程序。
server服務器端:
# 導入import 模塊 import socket server = socket.socket() # 建立一個socket對象 (準備一個手機) ip_port = ('192.168.12.34', 8001) # 給程序設置一個ip地址和端口號 (買一個手機卡)
server.bind(ip_port) # 綁定ip地址和端口, (插卡) server.listen() # 監聽ip地址和端口 (開機) conn,addr = server.acccept() # 等待創建鏈接,conn是鏈接通道,addr是客戶端的地址 from_client_msg = conn.recv(1024) # 服務端經過conn鏈接通道來收發消息,經過recv方法來接收,參數是字節(B) print(from_client_msg) conn.send(b'123') # 經過conn管道的send方法發送消息,參數必須是字節類型的 conn.close() #關閉通道,close()方法 server.close() # 關閉socket對象 (關機)
client客戶端:
# client客戶端 import socket # 引入socket模塊 client = socket.socket() # 建立socket對象 server_port = ('192.168.12.34',8001) # 找到服務器的ip地址和端口 client.connect(server_port) # 鏈接服務器的應用程序,經過connect方法,參數是服務器端的ip地址和端口 client.send(b'123') # 發送信息,調用者是client的socket對象 from_server_msg = client.recv(1024) # 接收信息 print(from_server_msg) client.close() # 關閉對象
注意:先運行server,而後再運行client,而後你會發現client這個文件再輸出臺的地方讓你輸入內容,你輸入一個內容而後回車,你會發現server那邊的控制檯就輸出了以client發送的內容
tcp頭:
位碼即tcp標誌位,標誌位字段(U,A,P,R,S,F):佔6比特, 含義以下:
1.tcp和udp的區別
TCP---傳輸控制協議,提供的是面向鏈接、可靠的字節流服務。
當客戶和服務器彼此交換數據前,必須先在雙方之間創建一個TCP鏈接,以後才能傳輸數據。TCP提供超時重發,丟棄重複數據,檢驗數據,流量控制等功能,保證數據能從一端傳到另外一端。
UDP---用戶數據報協議,是一個簡單的面向數據報的運輸層協議。
不提供可靠性,它只是把應用程序傳給IP層的數據報發送出去,可是並不能保證它們能到達目的地。因爲UDP在傳輸數據報前不用在客戶和服務器之間創建一個鏈接,且沒有超時重發等機制,故而傳輸速度很快
1.tcp 和 udp 下的socket
容許地址重用時須要加這一行代碼
import socket from socket import SOL_SOCKET,SO_REUSEADDR sk = socket.socket() # sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #容許地址重用
udp下的服務端與客戶端
客戶端:
import socket # 引入模塊 # 建立udp對象 udp_client = socket.socket(type = socket.SOCK_DGRAM) # 指定ip地址和端口 ip_port = ('127.0.0.1', 8001) # 發送消息 udp_client.sendto(b'hello',ip_port) # 解包消息 from_server_msg,sever_addr = udp_client.recvfrom(1024) # 打印消息 print(from_server_msg)
服務端:
import socket # 引包 # 建立socket對象 udp_server = socket.socket(type=socket.SOCK_DGRAM) # 指定ip地址 ip_port = ('127.0.0.1', 8001) # 綁定ip地址 udp_server.bind(ip_port) # 解構接收到的消息 from_client_msg, client_addr = udp_server.recvfrom(1024) # 發送消息 udp_server.sendto(b'you too', client_addr) # 打印消息 print(from_client_msg)
2.socket方法
套接字格式:
socket(family,type[,protocal]) 使用給定的地址族、套接字類型、協議編號(默認爲0)來建立套接字。
socket類型
socket函數
1.TCP發送數據時,已創建好TCP鏈接,因此不須要指定地址。UDP是面向無鏈接的,每次發送要指定是發給誰。
2.服務端與客戶端不能直接發送列表,元組,字典。須要字符串化repr(data)。
域名: www.baidu.com
三級域名.二級域名.頂級域名
DNS域名服務器
步驟1:
第一步:客戶機提出域名解析請求,並將該請求發送給本地的域名服務器. 第二步:當本地的域名服務器收到請求後,就先查詢本地的緩存,若是有該紀錄項,則本地的域名服務器就直接把查詢的結果返回. 第三步:若是本地的緩存中沒有該紀錄,則本地域名服務器就直接把請求發給根域名服務器,而後根域名服務器再返回給本地域名服務器一個所查詢域(根的子域)的主域名服務器的地址. 第四步:本地服務器再向上一步返回的域名服務器發送請求,而後接受請求的服務器查詢本身的緩存,若是沒有該紀錄,則返回相關的下級的域名服務器的地址. 第五步:重複第四步,直到找到正確的紀錄. 第六步:本地域名服務器把返回的結果保存到緩存,以備下一次使用,同時還將結果返回給客戶機. 讓咱們舉一個例子來詳細說明解析域名的過程.假設咱們的客戶機若是想要訪問站點:www.linejet.com此客戶本地的域名服務器是dns.company.com , 一個根域名服務器是NS.INTER.NET , 所要訪問的網站的域名服務器是dns.linejet.com,域名解析的過程以下所示. (1)客戶機發出請求解析域名www.linejet.com的報文 (2)本地的域名服務器收到請求後, 查詢本地緩存, 假設沒有該紀錄, 則本地域名服務器dns.company.com則向根域名服務器NS.INTER.NET發出請求解析域名www.linejet.com (3)根域名服務器NS.INTER.NET收到請求後查詢本地記錄獲得以下結果:linejet.com NS dns.linejet.com (表示linejet.com域中的域名服務器爲:dns.linejet.com ), 同時給出dns.linejet.com的地址,並將結果返回給域名服務器dns.company.com (4)域名服務器dns.company.com 收到迴應後,再發出請求解析域名www.linejet.com的報文. (5)域名服務器 dns.linejet.com收到請求後,開始查詢本地的記錄,找到以下一條記錄:www.linejet.com A 211.120.3.12 (表示linejet.com域中域名服務器dns.linejet.com的IP地址爲:211.120.3.12),並將結果返回給客戶本地域名服務器dns.company.com (6)客戶本地域名服務器將返回的結果保存到本地緩存,同時將結果返回給客戶機. 這樣就完成了一次域名解析過程.