應用層 | DHCP·DNS·FTP·Gopher·HTTP·IMAP4·IRC·NNTP·XMPP·POP3·SIP·SMTP·SNMP·SSH·TELNET·RPC·RTCP·RTP·RTSP·SDP·SOAP·GTP·STUN·NTP·SSDP |
表示層 | HTTP/HTML·FTP·Telnet·ASN.1 (具備表示層功能) HTTPS |
會話層 | ADSP·ASP·H.245·ISO-SP·iSNS·NetBIOS·PAP·RPC· RTCP·SMPP·SCP·SSH·ZIP·SDP (具備會話層功能) |
傳輸層 | TCP·UDP·TLS·DCCP·SCTP·RSVP·PPTP |
網絡層 | IP(IPv4·IPv6)·ICMP·ICMPv6·IGMP·IS-IS·IPsec·BGP·RIP·OSPF·ARP·RARP |
數據鏈路層 | Wi-Fi(IEEE 802.11)·WiMAX(IEEE 802.16)·ATM·DTM·令牌環·以太網路·FDDI.幀中繼·GPRS·EVDO·HSPA·HDLC·PPP·L2TP·ISDNSTP |
物理層 | 以太網路卡·調制解調器·電力線通訊(PLC)·SONET/SDH (光同步數字傳輸網)·G.709 (光傳輸網絡)·光導纖維·同軸電纜·雙絞線 |
各層的功能簡述: 【1】物理層:主要定義物理設備標準,如網線的接口類型、光纖的接口類型、各類傳輸介質的傳輸速率等。它的主要做用是傳輸比特流(就是由一、0轉化爲電流強弱來進行傳輸,到達目的地後在轉化爲一、0,也就是咱們常說的數模轉換與模數轉換),這一層的數據叫作比特。 【2】數據鏈路層:定義瞭如何讓格式化數據以進行傳輸,以及如何讓控制對物理介質的訪問,這一層一般還提供錯誤檢測和糾正,以確保數據的可靠傳輸。 【3】網絡層:在位於不一樣地理位置的網絡中的兩個主機系統之間提供鏈接和路徑選擇,Internet的發展使得從世界各站點訪問信息的用戶數大大增長,而網絡層正是管理這種鏈接的層。 【4】傳輸層:定義了一些傳輸數據的協議和端口號(WWW端口80等),如:TCP(傳輸控制協議,傳輸效率低,可靠性強,用於傳輸可靠性要求高,數據量大的數據),UDP(用戶數據報協議,與TCP特性偏偏相反,用於傳輸可靠性要求不高,數據量小的數據,如QQ聊天數據就是經過這種方式傳輸的), 主要是將從下層接收的數據進行分段和傳輸,到達目的地址後再進行重組,經常把這一層數據叫作段。 【5】會話層:經過傳輸層(端口號:傳輸端口與接收端口)創建數據傳輸的通路,主要在你的系統之間發起會話或者接受會話請求(設備之間須要互相認識能夠是IP也能夠是MAC或者是主機名)。 【6】表示層:可確保一個系統的應用層所發送的信息能夠被另外一個系統的應用層讀取。例如,PC程序與另外一臺計算機進行通訊,其中一臺計算機使用擴展二一十進制交換碼(EBCDIC),而另外一臺則使用美國信息交換標準碼(ASCII)來表示相同的字符。若有必要,表示層會經過使用一種通格式來實現多種數據格式之間的轉換。 【7】應用層: 是最靠近用戶的OSI層,這一層爲用戶的應用程序(例如電子郵件、文件傳輸和終端仿真)提供網絡服務。 各層中涉及的協議的簡單解釋: 應用層 ·DHCP(動態主機分配協議) · DNS (域名解析) · FTP(File Transfer Protocol)文件傳輸協議 · Gopher (英文原義:The Internet Gopher Protocol 中文釋義:(RFC-1436)網際Gopher協議) · HTTP (Hypertext Transfer Protocol)超文本傳輸協議 · IMAP4 (Internet Message Access Protocol 4) 即 Internet信息訪問協議的第4版本 · IRC (Internet Relay Chat )網絡聊天協議 · NNTP (Network News Transport Protocol)RFC-977)網絡新聞傳輸協議 · XMPP 可擴展消息處理現場協議 · POP3 (Post Office Protocol 3)即郵局協議的第3個版本 · SIP 信令控制協議 · SMTP (Simple Mail Transfer Protocol)即簡單郵件傳輸協議 · SNMP (Simple Network Management Protocol,簡單網絡管理協議) · SSH (Secure Shell)安全外殼協議 · TELNET 遠程登陸協議 · RPC (Remote Procedure Call Protocol)(RFC-1831)遠程過程調用協議 · RTCP (RTP Control Protocol)RTP 控制協議 · RTSP (Real Time Streaming Protocol)實時流傳輸協議 · TLS (Transport Layer Security Protocol)安全傳輸層協議 · SDP( Session Description Protocol)會話描述協議 · SOAP (Simple Object Access Protocol)簡單對象訪問協議 · GTP 通用數據傳輸平臺 · STUN (Simple Traversal of UDP over NATs,NAT 的UDP簡單穿越)是一種網絡協議 · NTP (Network Time Protocol)網絡校時協議 傳輸層 ·TCP(Transmission Control Protocol)傳輸控制協議 · UDP (User Datagram Protocol)用戶數據報協議 · DCCP (Datagram Congestion Control Protocol)數據報擁塞控制協議 · SCTP(STREAM CONTROL TRANSMISSION PROTOCOL)流控制傳輸協議 · RTP(Real-time Transport Protocol或簡寫RTP)實時傳送協議 · RSVP (Resource ReSer Vation Protocol)資源預留協議 · PPTP ( Point to Point Tunneling Protocol)點對點隧道協議 網絡層 IP(IPv4 · IPv6) Internet Protocol(網絡之間互連的協議) ARP : Address Resolution Protocol即地址解析協議,實現經過IP地址得知其物理地址。 RARP :Reverse Address Resolution Protocol 反向地址轉換協議容許局域網的物理機器從網關服務器的 ARP 表或者緩存上請求其 IP 地址。 ICMP :(Internet Control Message Protocol)Internet控制報文協議。它是TCP/IP協議族的一個子協議,用於在IP主機、路由器之間傳遞控制消息。 ICMPv6: IGMP :Internet 組管理協議(IGMP)是因特網協議家族中的一個組播協議,用於IP 主機向任一個直接相鄰的路由器報告他們的組成員狀況。 RIP : 路由信息協議(RIP)是一種在網關與主機之間交換路由選擇信息的標準。 OSPF : (Open Shortest Path First開放式最短路徑優先). BGP :(Border Gateway Protocol )邊界網關協議,用來鏈接Internet上獨立系統的路由選擇協議 IS-IS:(Intermediate System to Intermediate System Routing Protocol)中間系統到中間系統的路由選擇協議. IPsec:「Internet 協議安全性」是一種開放標準的框架結構,經過使用加密的安全服務以確保在 Internet 協議 (IP) 網絡上進行保密而安全的通信。 數據鏈路層 802.11 · 802.16 · Wi-Fi · WiMAX · ATM · DTM · 令牌環 · 以太網 · FDDI · 幀中繼 · GPRS · EVDO · HSPA · HDLC · PPP · L2TP · ISDN 物理層 以太網物理層 · 調制解調器 · PLC · SONET/SDH · G.709 · 光導纖維 · 同軸電纜 · 雙絞線
· 一組電信號構成一個數據包,叫作幀 · 每一數據幀分紅:包頭head和數據data兩部分 head包含:固定18個字節 · 發送者/源地址,6個字節 · 接收者/目標地址 6個字節 · 數據類型 6個字節 data包含:最短46個字節,最長1500字節 ·數據包的具體內容 head長度 + data長度 = 最短64字節,最長1518字節,超過最大限制就分片發送
以太網頭 | IP頭 | IP數據 |
地址解析協議,即ARP(Address Resolution Protocol),是根據IP地址獲取物理地址的一個TCP/IP協議。
主機發送信息時將包含目標IP地址的ARP請求廣播到網絡上的全部主機,並接收返回消息,以此肯定目標的物理地址。
收到返回消息後將該IP地址和物理地址存入本機ARP緩存中並保留必定時間,下次請求時直接查詢ARP緩存以節約資源。
地址解析協議是創建在網絡中各個主機互相信任的基礎上的,網絡上的主機能夠自主發送ARP應答消息,其餘主機收到應答報文時不會檢測該報文的真實性就會將其記入本機ARP緩存;由此攻擊者就能夠向某一主機發送僞ARP應答報文,使其發送的信息沒法到達預期的主機或到達錯誤的主機,這就構成了一個ARP欺騙。ARP命令可用於查詢本機ARP緩存中IP地址和MAC地址的對應關係、添加或刪除靜態對應關係等。相關協議有RARP、代理ARP。NDP用於在IPv6中代替地址解析協議。
場景 | 數據包地址 |
同一子網 | 目標主機mac,目標主機ip |
不一樣子網 | 網關mac,目標主機ip |
源mac | 目標mac | 源IP | 目標IP | 數據部分 | |
發送端主機 | 發送端mac | FF:FF:FF:FF:FF:FF | 172.16.10.10/24 | 172.16.10.11/24 | 數據 |
以太網頭 | IP頭 | TCP頭 | 數據 |
以太網頭 | IP頭 | UDP頭 | 數據 |
TCP---傳輸控制協議,提供的是面向鏈接、可靠的字節流服務。當客戶和服務器彼此交換數據前,必須先在雙方之間創建一個TCP鏈接,以後才能傳輸數據。TCP提供超時重發,丟棄重複數據,檢驗數據,流量控制等功能,保證數據能從一端傳到另外一端。 UDP---用戶數據報協議,是一個簡單的面向數據報的運輸層協議。UDP不提供可靠性,它只是把應用程序傳給IP層的數據報發送出去,可是並不能保證它們能到達目的地。因爲UDP在傳輸數據報前不用在客戶和服務器之間創建一個鏈接,且沒有超時重發等機制,故而傳輸速度很快 如今Internet上流行的協議是TCP/IP協議,該協議中對低於1024的端口都有確切的定義,他們對應着Internet上一些常見的服務。這些常見的服務能夠分爲使用TCP端口(面向鏈接)和使用UDP端口(面向無鏈接)兩種。 說到TCP和UDP,首先要明白「鏈接」和「無鏈接」的含義,他們的關係能夠用一個形象地比喻來講明,就是打電話和寫信。兩我的若是要通話,首先要創建鏈接——即打電話時的撥號,等待響應後——即接聽電話後,才能相互傳遞信息,最後還要斷開鏈接——即掛電話。寫信就比較簡單了,填寫好收信人的地址後將信投入郵筒,收信人就能夠收到了。從這個分析能夠看出,創建鏈接能夠在須要痛心地雙方創建一個傳遞信息的通道,在發送方發送請求鏈接信息接收方響應後,因爲是在接受方響應後纔開始傳遞信息,並且是在一個通道中傳送,所以接受方能比較完整地收到發送方發出的信息,即信息傳遞的可靠性比較高。但也正由於須要創建鏈接,使資源開銷加大(在創建鏈接前必須等待接受方響應,傳輸信息過程當中必須確認信息是否傳到及斷開鏈接時發出相應的信號等),獨佔一個通道,在斷開鏈接錢不能創建另外一個鏈接,即兩人在通話過程當中第三方不能打入電話。而無鏈接是一開始就發送信息(嚴格說來,這是沒有開始、結束的),只是一次性的傳遞,是先不須要接受方的響應,於是在必定程度上也沒法保證信息傳遞的可靠性了,就像寫信同樣,咱們只是將信寄出去,卻不能保證收信人必定能夠收到。 TCP是面向鏈接的,有比較高的可靠性, 一些要求比較高的服務通常使用這個協議,如FTP、Telnet、SMTP、HTTP、POP3等。 而UDP是面向無鏈接的,使用這個協議的常見服務有DNS、SNMP、QQ等。對於QQ必須另外說明一下,QQ2003之前是隻使用UDP協議的,其服務器使用8000端口,偵聽是否有信息傳來,客戶端使用4000端口,向外發送信息(這也就不難理解在通常的顯IP的QQ版本中顯示好友的IP地址信息中端口常爲4000或其後續端口的緣由了),即QQ程序既接受服務又提供服務,在之後的QQ版本中也支持使用TCP協議了。
1 源端口和目的端口,各佔2個字節,分別寫入源端口和目的端口; 2 序號,佔4個字節,TCP鏈接中傳送的字節流中的每一個字節都按順序編號。例如,一段報文的序號字段值是 301 ,而攜帶的數據共有100字段,顯然下一個報文段(若是還有的話)的數據序號應該從401開始; 3 確認號,佔4個字節,是指望收到對方下一個報文的第一個數據字節的序號。例如,B收到了A發送過來的報文,其序列號字段是501,而數據長度是200字節,這代表B正確的收到了A發送的到序號700爲止的數據。所以,B指望收到A的下一個數據序號是701,因而B在發送給A的確認報文段中把確認號置爲701; 4 數據偏移,佔4位,它指出TCP報文的數據距離TCP報文段的起始處有多遠; 5 保留,佔6位,保留從此使用,但目前應都位0; 6 緊急URG,當URG=1,代表緊急指針字段有效。告訴系統此報文段中有緊急數據; 7 確認ACK,僅當ACK=1時,確認號字段纔有效。TCP規定,在鏈接創建後全部報文的傳輸都必須把ACK置1; 8 推送PSH,當兩個應用進程進行交互式通訊時,有時在一端的應用進程但願在鍵入一個命令後當即就能收到對方的響應,這時候就將PSH=1; 9 復位RST,當RST=1,代表TCP鏈接中出現嚴重差錯,必須釋放鏈接,而後再從新創建鏈接; 10 同步SYN,在鏈接創建時用來同步序號。當SYN=1,ACK=0,代表是鏈接請求報文,若贊成鏈接,則響應報文中應該使SYN=1,ACK=1; 11 終止FIN,用來釋放鏈接。當FIN=1,代表此報文的發送方的數據已經發送完畢,而且要求釋放; 12 窗口,佔2字節,指的是通知接收方,發送本報文你須要有多大的空間來接受; 13 檢驗和,佔2字節,校驗首部和數據這兩部分; 14 緊急指針,佔2字節,指出本報文段中的緊急數據的字節數; 15 選項,長度可變,定義一些其餘的可選的參數。
應用程序 | FTP | TETP | TELNET | SMTP | DNS | HTTP | SSH | MYSQL |
熟知端口 | 2120 | 69 | 23 | 25 | 53 | 80 | 22 | 3306 |
傳輸層協議 | TCP | UDP | TCP | TCP | UDP | TCP |
1、TCP 服務器進程先建立傳輸控制塊TCB,時刻準備接收客戶進程的鏈接請求,此時服務器就進入了listen(監聽)狀態; 二、TCP客戶進程也是先建立傳輸控制塊TCB,而後向服務器發出鏈接請求報文,這時報文首部中的筒不爲SYN=1,同時選擇一個初始序列號seq=x,此時,TCP客戶端進程進入了SYN-SENT(同步已發送狀態)狀態。TCP規定,SYN報文段(SYN=1的報文段)不能攜帶數據,但須要消耗掉一個序號。 三、TCP服務器收到請求報文後,若是贊成鏈接,則發出確認報文。確認報文中應該ACK=1,SYN=1,確認號是ack=x+1,同時也要爲本身初始化一個序列號seq=y,此時,TCP服務器進程進入了SYN-RCVD(同步收到)狀態。這個報文也不能攜帶序列號,可是一樣須要消耗掉一個序號。 四、TCP客戶進程收到確認後,還要向服務器給出確認。確認報文的ACK=1,ack=y+1,本身的序列號seq=x+1,此時,TCP鏈接創建,客戶端進入eatablished(已創建鏈接)狀態。TCP規定。ACK報文段能夠攜帶數據,可是若是不攜帶數據則不消耗序號。 五、當服務端收到客戶端的確認後也進入estableshed狀態,此後雙方就能夠通訊了。
一句話,主要防止已經失效的鏈接請求報文忽然又傳送到了服務器,從而產生錯誤。
若是使用的是兩次握手創建鏈接,假設有這樣一種場景,客戶端發送了第一個請求鏈接而且沒有丟失,只是由於在網絡結點中滯留的時間太長了,因爲TCP的客戶端遲遲沒有收到確認報文,覺得服務器沒有收到,此時從新向服務器發送這條報文,此後客戶端和服務器通過兩次握手完成鏈接,傳輸數據,而後關閉鏈接。此時此前滯留的那一次請求鏈接,網絡通暢了到達了服務器,這個報文本該是失效的,可是,兩次握手的機制將會讓客戶端和服務器再次創建鏈接,這將致使沒必要要的錯誤和資源的浪費。
若是採用的是三次握手,就算是那一次失效的報文傳送過來了,服務端接受到了那條失效報文而且回覆了確認報文,可是客戶端不會再次發出確認。因爲服務器收不到確認,就知道客戶端並無請求鏈接。
數據傳輸完畢以後,雙方均可釋放鏈接。最開始的時候,客戶端和服務端都是處於established狀態,而後客戶端主動關閉,服務器被動關閉。服務端也能夠主動關閉,一個流程。 一、客戶端進程發出鏈接釋放報文,並中止發送數據。釋放報文數據首部,FIN=1,其序列號爲seq=u(等於前面已經傳過來的數據的最後一個字節的序號加1),此時客戶端進入FIN-WAIT-1(終止等待1)狀態。TCP規定,FIN報文段即便不攜帶數據,也要消耗掉一個序號。 二、服務器收到鏈接釋放保溫,發出確認報文,ACK=1,ack=u+1,而且帶上本身的序列號seq=v,此時,服務端就進入了CLOSE-WAIT(關閉等待)狀態。TCP服務器通知高層的應用進程,客戶端向服務器的方向就釋放了,這時候處於半關閉狀態,即客戶端已經沒有數據要發放了,可是服務器若發送數據,客戶端依然要接受。這個狀態還要持續一段時間,也就是整個CLOSE-WAIT狀態持續的時間。 三、客戶端收到服務器的確認請求後,此時客戶端就進入FIN-WAIT-2(終止等待2)狀態,等待服務器發送連接釋放報文(在這以前還須要接受服務器發送的最後的數據)。 四、服務器將最後的數據發送完畢以後,就像客戶端發送鏈接釋放報文,FIN=1,ack=u+1,因爲在半關閉狀態,服務器可能有發送了一些數據,假定此時的序列號weiseq=w,此時服務器就進入了LAST-ACK(最後確認)狀態,等待客戶端的確認。 五、客戶端收到服務器的裂解釋放報文後,必須發出確認,ACK=1,ack=w+1,而本身的序列號seq=u+1,此時客戶端就進入了TIME-WAIT(時間等待)狀態。注意此時TCP鏈接尚未釋放,必須通過2**MSL(最長報文段壽命)的時間,當客戶端撤銷相應的TCB後,才進入CLOSE狀態。 六、服務器只要收到了客戶端發出的確認,當即進入CLOSE狀態。同一樣,撤銷TCB後,就結束了此次的TCB鏈接。能夠看到,服務器結束TCB鏈接的時間要比客戶端早一些。
MSL(Maximum Segment Lifetime),TCP容許不一樣的實現能夠設置不一樣的MSL值。 第一,保證客戶端發送的最後一個ACK報文可以到達服務器,由於這個ACK報文可能丟失,站在服務器的角度看來,我已經發送了FIN+ACK報文請求斷開了,客戶端尚未給我回應,應該是我發送的請求斷開報文它沒有收到,因而服務器又會從新發送一次,而客戶端就能在這個2MSL時間段內收到這個重傳的報文,接着給出迴應報文,而且會重啓2MSL計時器。 第二,防止相似與「三次握手」中提到了的「已經失效的鏈接請求報文段」出如今本鏈接中。客戶端發送完最後一個確認報文後,在這個2MSL時間中,就可使本鏈接持續的時間內所產生的全部報文段都從網絡中消失。這樣新的鏈接中不會出現舊鏈接的請求報文。 爲何創建鏈接是三次握手,關閉鏈接確是四次揮手呢? 創建鏈接的時候, 服務器在LISTEN狀態下,收到創建鏈接請求的SYN報文後,把ACK和SYN放在一個報文裏發送給客戶端。 而關閉鏈接時,服務器收到對方的FIN報文時,僅僅表示對方再也不發送數據了可是還能接收數據,而本身也未必所有數據都發送給對方了,因此己方能夠當即關閉,也能夠發送一些數據給對方後,再發送FIN報文給對方來表示贊成如今關閉鏈接,所以,己方ACK和FIN通常都會分開發送,從而致使多了一次。
三次握手: TCP是因特網中的傳輸層協議,使用三次握手協議創建鏈接。當主動方發出SYN鏈接請求後,等待對方回答SYN+ACK[1],並最終對對方的 SYN 執行 ACK 確認。這種創建鏈接的方法能夠防止產生錯誤的鏈接。[1] TCP三次握手的過程以下: 客戶端發送SYN(SEQ=x)報文給服務器端,進入SYN_SEND狀態。 服務器端收到SYN報文,迴應一個SYN (SEQ=y)ACK(ACK=x+1)報文,進入SYN_RECV狀態。 客戶端收到服務器端的SYN報文,迴應一個ACK(ACK=y+1)報文,進入Established狀態。 三次握手完成,TCP客戶端和服務器端成功地創建鏈接,能夠開始傳輸數據了。 四次揮手: 創建一個鏈接須要三次握手,而終止一個鏈接要通過四次握手,這是由TCP的半關閉(half-close)形成的。 (1) 某個應用進程首先調用close,稱該端執行「主動關閉」(active close)。該端的TCP因而發送一個FIN分節,表示數據發送完畢。 (2) 接收到這個FIN的對端執行 「被動關閉」(passive close),這個FIN由TCP確認。 注意:FIN的接收也做爲一個文件結束符(end-of-file)傳遞給接收端應用進程,放在已排隊等候該應用進程接收的任何其餘數據以後,由於,FIN的接收意味着接收端應用進程在相應鏈接上再無額外數據可接收。 (3) 一段時間後,接收到這個文件結束符的應用進程將調用close關閉它的套接字。這致使它的TCP也發送一個FIN。 (4) 接收這個最終FIN的原發送端TCP(即執行主動關閉的那一端)確認這個FIN。[1] 既然每一個方向都須要一個FIN和一個ACK,所以一般須要4個分節。 注意: (1) 「一般」是指,某些狀況下,步驟1的FIN隨數據一塊兒發送,另外,步驟2和步驟3發送的分節都出自執行被動關閉那一端,有可能被合併成一個分節。[2] (2) 在步驟2與步驟3之間,從執行被動關閉一端到執行主動關閉一端流動數據是可能的,這稱爲「半關閉」(half-close)。 (3) 當一個Unix進程不管自願地(調用exit或從main函數返回)仍是非自願地(收到一個終止本進程的信號)終止時,全部打開的描述符都被關閉,這也致使仍然打開的任何TCP鏈接上也發出一個FIN。 不管是客戶仍是服務器,任何一端均可以執行主動關閉。一般狀況是,客戶執行主動關閉,可是某些協議,例如,HTTP/1.0卻由服務器執行主動關閉。[2] 爲何是四次揮手,是由於TCP創建的是全雙工通道,你和我斷了,我仍是能夠給你發消息的,因此你斷了以後,也須要我進行斷開連接,因此要進行四次揮手確認。
Socket又稱爲套接字,它是應用層與TCP/IP協議族通訊的中間軟件抽象層,它是一組接口。 在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協議族隱藏在Socket接口後面,對用戶來講,一組簡單的接口就是所有,讓Socket去組織數據,以符合指定的協議。當咱們使用不一樣的協議進行通訊時就得使用不一樣的接口,還得處理不一樣協議的各類細節,這就增長了開發的難度,軟件也不易於擴展(就像咱們開發一套公司管理系統同樣,報帳、會議預約、請假等功能不須要單獨寫系統,而是一個系統上多個功能接口,不須要知道每一個功能如何去實現的)。 因而UNIX BSD就發明了socket這種東西,socket屏蔽了各個協議的通訊細節,使得程序員無需關注協議自己,直接使用socket提供的接口來進行互聯的不一樣主機間的進程的通訊。 這就比如操做系統給咱們提供了使用底層硬件功能的系統調用,經過系統調用咱們能夠方便的使用磁盤(文件操做),使用內存,而無需本身去進行磁盤讀寫,內存管理。socket其實也是同樣的東西,就是提供了tcp/ip協議的抽象,對外提供了一套接口,同過這個接口就能夠統1、方便的使用tcp/ip協議的功能了。 其實站在你的角度上看,socket就是一個模塊。咱們經過調用模塊中已經實現的方法創建兩個進程之間的鏈接和通訊。也有人將socket說成ip+port,由於ip是用來標識互聯網中的一臺主機的位置,而port是用來標識這臺機器上的一個應用程序。 因此咱們只要確立了ip和port就能找到一個應用程序,而且使用socket模塊來與之通訊。 歷史:套接字起源於 20 世紀 70 年代加利福尼亞大學伯克利分校版本的 Unix,即人們所說的 BSD Unix。 所以,有時人們也把套接字稱爲「伯克利套接字」或「BSD 套接字」。一開始,套接字被設計用在同 一臺主機上多個應用程序之間的通信。這也被稱進程間通信,或 IPC。套接字有兩種(或者稱爲有兩個種族),分別是基於文件型的和基於網絡型的。
基於文件類型的套接字家族
套接字家族的名字:AF_UNIX
unix一切皆文件,基於文件的套接字調用的就是底層的文件系統來取數據,兩個套接字進程運行在同一機器,能夠經過訪問同一個文件系統間接完成通訊
基於網絡類型的套接字家族
套接字家族的名字:AF_INET
(還有AF_INET6被用於ipv6,還有一些其餘的地址家族,不過,他們要麼是隻用於某個平臺,要麼就是已經被廢棄,或者是不多被使用,或者是根本沒有實現,全部地址家族中,AF_INET是使用最普遍的一個,python支持不少種地址家族,可是因爲咱們只關心網絡編程,因此大部分時候咱們只使用AF_INET)
socket在內的5層通訊流程python
TCP和UDP下socket差別對比圖程序員
import socket server = socket.socket() server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) ip_port = ('127.0.0.1',8080) server.bind(ip_port) server.listen(3) while 1: conn,addr = server.accept() # 在這裏阻塞,等待客戶端過來鏈接 while 1: from_client_msg = conn.recv(1024) # 接收消息,在這裏仍是阻塞,等待接受消息 print('來自大海的消息:',from_client_msg.decode('utf-8')) if from_client_msg.decode('utf-8') == 'bye': # 若是接收到的消息爲bye,退出 break to_client_msg = input('星空:') # 服務端發出消息 conn.send(to_client_msg.encode('utf-8')) conn.close()
import socket client = socket.socket() client.connect(('127.0.0.1',8080)) while 1: to_server_msg = input('大海說:') client.send(to_server_msg.encode('utf-8')) if to_server_msg == 'bye': break from_server_msg = client.recv(1024) print('來自星空的消息:',from_server_msg.decode('utf-8'))
import socket udp_server = socket.socket(type=socket.SOCK_DGRAM) ip_port = ('127.0.0.1',8090) udp_server.bind(ip_port) from_client_msg,client_addr = udp_server.recvfrom(1024) udp_server.sendto(b'sha',client_addr) print(from_client_msg,client_addr)
import socket udp_client = socket.socket(type=socket.SOCK_DGRAM) ip_port = ('127.0.0.1',8090) udp_client.sendto(b'hello',ip_port) from_server_msg,server_addr = udp_client.recvfrom(1024) print(from_server_msg,server_addr)
import socket udp_server = socket.socket(type=socket.SOCK_DGRAM) ip_port = ('127.0.0.1',8010) udp_server.bind(ip_port) while 1: from_client_msg,client_addr = udp_server.recvfrom(1024) print(from_client_msg.decode('utf-8'),client_addr) to_client_msg = input('服務器說:') udp_server.sendto(to_client_msg.encode('utf-8'),client_addr) udf_server.close()
import socket udp_client = socket.socket(type=socket.SOCK_DGRAM) ip_port = ('127.0.0.1',8010) while 1: to_server_msg = input('客戶端說:') udp_client.sendto(to_server_msg.encode('utf-8'),ip_port) from_server_msg,server_addr = udp_client.recvfrom(1024) print(from_server_msg.decode('utf-8'),server_addr) udp_client.close()