SOCKET的簡單介紹


客戶端/服務器架構

1.硬件C/S架構(打印機)

2.軟件C/S架構(互聯網中處處是C/S架構):B/S架構也是C/S架構的一種,B/S是瀏覽器/服務器

C/S架構與socket的關系:我們用socket就是為了完成C/S架構的開發

OSI七層協議(*******)

互聯網協議按照功能不同分為osi七層或tcp/ip五層或tcp/ip四層

 

 每層運行常見物理設備

 

 引子:

須知一個完整的計算機系統是由硬件,操作系統,應用軟件三者組成,具備了這三個條件,一台計算機系統就可以自己跟自己完了(比如玩個掃雷).如果你要跟別人一起玩,那就需要上網了,什么是互聯網?

互聯網的核心就是一對協議的組成,協議就是標准,比如全世界人通信的標准是英語

如果把計算機比作人的話,互聯網協議就是計算機界的英語,所有的計算機都學會了互聯網協議,那所有的計算機就可以按照統一的規則標准去收發消息進行通信了,人們按照分工不同把互聯網協議從邏輯上划分成了層級。

詳見網絡通信原理!

為何學習socket一定要先學習互聯網協議呢?

  首先C/S架構是基於網絡通信的

  然后網絡的核心就是一堆網絡協議,也就是協議標准。如果你想開發一款基於網絡通信的軟件,就必須遵循這些標准。

 

 socket層

 

 socket是什么?

socket是應用層與TCP/IP協議通信的中間軟件抽象層,它是一組接口。在設計模式中,Socket其實就是一個門面模式,它把復雜的TCP/IP協議隱藏在socket接口后面,對用戶來說,一組簡單的接口就是全部,讓Socket去組織數據,以符合指定的協議。所以,我么們無需深入的去理解tcp/udp協議,socket已經為我們封裝好了,我們只需要遵循socket的規定去編程,寫出的程序自然遵循tcp/udp標准的。

基於TCP協議的Socket

套接字的分類:

  基於文件類型的套接字家族:AF_UNIX(在Unix系統上,一切接文件,基於文件的套接字調用的就是底層的文件系統來取數據,兩個套接字進程同時運行在同一機器上,可以通過訪問同一文件系統間完成通信)

  基於網絡類型的套接字家族:AF_INET(在Python中支持很多種地址家族,但是由於我們只關心網絡編程,所以大部分時候我們只用AF_INET)

套接字工作流程:

下面我們舉個打電話的例子來說明一下:

如果你要給一個朋友打電話,先撥號,朋友聽到電話鈴聲后提起電話,這時你和你的朋友就建立起了鏈接,就可以講話了。等交流結束,掛電話結束此次交談。生活中的場景就解釋了這工作原理。(如果你去一家餐館吃飯,假設那里的老板就是服務端,而你就是客戶端,當你去吃飯的時候,你肯定的知道那個餐館的地址,對於你自己來說,老板不需要你的地址。)

 

 注意:

如果你在重啟服務端的時候可能會遇到這樣的問題:

 

 這個是由於你的服務端仍然存在四次揮手的time_wait狀態在占用地址(如果不懂,請深入研究1.tcp三次握手,四次揮手2.syn洪水攻擊3.服務器高並發情況下會有大量的time_wait狀態的優化方法)

解決上述方法:

1 #加入一條socket配置,重用ip和端口
2 
3 phone=socket(AF_INET,SOCK_STREAM)
4 phone.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加
5 phone.bind(('127.0.0.1',8080))

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM