網絡通訊協議,TCP和UDP 的區別

一、網絡通訊
 
互聯網本質就是一系列的網絡通訊,互聯網協議的功能是定義計算機如何介入internet,以及介入internet的計算機通訊的標準。互聯網協議按照功能不一樣分爲osi7層或tcp/ip五層或tcp/ip四層
   一、osi七層協議
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
應用層 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 · 光導纖維 · 同軸電纜 · 雙絞線
各層的功能簡述
 
咱們寫的程序屬於應用層
 
每層運行常見的物理設備
 

 

二、tcp/ip五層模型講解
 
5層通訊流程

 

 

①物理層
     由來:把孤立的計算機想要鏈接起來,就必須介入internet,計算機之間必須完成組網
     功能:主要基於電器特性發送高低電壓(電信號),高電壓對應數字1,低電壓對應數字0
  ②數據鏈路層
     由來:單純的電信號0和1沒有任何意義,必須規定電信號多少位1組,魅族是什麼意思
     功能:定義了電信號的分組方式
    以太網協議:早期的時候各個公司都有本身的分組方式,後來造成了統一的標準,即以太網協議ethernet
 
· 一組電信號構成一個數據包,叫作幀
· 每一數據幀分紅:包頭head和數據data兩部分
    head包含:固定18個字節
        · 發送者/源地址,6個字節
        · 接收者/目標地址 6個字節
        · 數據類型 6個字節
    data包含:最短46個字節,最長1500字節
        ·數據包的具體內容

head長度 + data長度 = 最短64字節,最長1518字節,超過最大限制就分片發送
以太網協議內容
 mac地址:
        head中包含的源和目標地址由來:etnernrt國定接入internet的設備必須具有網卡,發送端和接收端的地址即是指網卡的地址,即mac地址
mac地址:每塊網卡出廠時都被燒製成世界上惟一的mac地址,長度爲48爲2進制,一般由12爲16進制數表示(前六位時廠商編號,後六位時流水線好)
 
    廣播:
 
    有了mac地址,同一網絡內的兩臺主機就能夠通訊了(一臺主機哦那個過arp協議獲取另一臺主機的mac'地址)。ethernet(以太網)採用最原始的方式廣播進行通訊。
 
 
 ③網絡層
   由來:有了ethernet、mac地址、廣播的發送方式,世界上的計算機就能夠彼此通訊了,問題時世界範圍內的互聯網是由一個一個彼此隔離的小的局域網組成,那麼若果全部的通訊都採用以太網的廣播方式,那麼一臺機器發送的包全世界都會收到,太可怕。
 
 

 

上圖結論:必須找出一種方法來區分那些計算機屬於同一廣播域,那些不是。若是是就採用廣播的方式發送,若是不是,就採用路由的方式(向不統廣播域/子網分發數據包),mac地址沒法區分,它只跟廠商有關。
IP協議:
規定網絡地址的協議叫IP協議,它定義的地址稱爲IP地址。
IP地址分紅兩部分:
    網絡部份:標識子網
    主機部分:標識主機
子網掩碼:
所謂子網掩碼,就是表示子網特徵的一個參數,它在形式上等同於IP地址,也是一個32位二進制數字,它的網絡部份所有位1,主機部分所有爲0.255.255.255.0
 
IP協議的做用:一個是爲每一臺計算機分配IP地址,另外一個時肯定哪些地址在同一個子網絡。
 
IP數據包:
        分爲head和打他兩部分,無需爲IP包定義單獨的欄位,直接放入以太網包的data部分。
 
head:長度爲20到60字節
data:最長爲65515字節
 
以太網頭 IP頭 IP數據
 
 
ARP協議
 
由來:計算機通訊基本靠吼,即廣播的方式,全部上層的包到最後都要封裝上以太網頭,而後經過以太網協議發送,在談及以太網協議時候,我門瞭解到通訊是基於mac的廣播方式實現,計算機在發包時,獲取自身的mac是容易的,如何獲取目標主機的mac,就須要經過arp協議
功能:廣播的方式發送數據包,候去目標主機的mac地址
 
地址解析協議,即ARP(Address Resolution Protocol),是根據IP地址獲取物理地址的一個TCP/IP協議。
  主機發送信息時將包含目標IP地址的ARP請求廣播到網絡上的全部主機,並接收返回消息,以此肯定目標的物理地址。
  收到返回消息後將該IP地址和物理地址存入本機ARP緩存中並保留必定時間,下次請求時直接查詢ARP緩存以節約資源。
  地址解析協議是創建在網絡中各個主機互相信任的基礎上的,網絡上的主機能夠自主發送ARP應答消息,其餘主機收到應答報文時不會檢測該報文的真實性就會將其記入本機ARP緩存;由此攻擊者就能夠向某一主機發送僞ARP應答報文,使其發送的信息沒法到達預期的主機或到達錯誤的主機,這就構成了一個ARP欺騙。ARP命令可用於查詢本機ARP緩存中IP地址和MAC地址的對應關係、添加或刪除靜態對應關係等。相關協議有RARP、代理ARP。NDP用於在IPv6中代替地址解析協議。
ARP
協議工做方式:每臺主機ip都是已知的(我只知道個人局域網ip地址,要給一個非同一網絡的我不知道ip地址的電腦發消息,怎麼辦:NET穿透)
    例如:主機172.16.10.10/24訪問172.16.10.11/24
一:首先經過ip地址和子網掩碼區分出本身所處的子網
 
場景 數據包地址
同一子網 目標主機mac,目標主機ip
不一樣子網 網關mac,目標主機ip
 
 
 
 
 
 
二:分析172.16.10.10/24與172.16.10.11/24處於同一網絡(若是不是同一網絡,那麼下表中目標ip爲172.16.10.1,經過arp獲取的是網關的mac)
 
 
  源mac 目標mac 源IP 目標IP 數據部分
發送端主機 發送端mac FF:FF:FF:FF:FF:FF 172.16.10.10/24 172.16.10.11/24 數據
 
 
 
 
 
三:這個包會以廣播的方式在發送端所處的子網內傳輸,全部主機接收後拆開包,發現目標ip爲本身的,就響應,返回本身的mac
 
④ 傳輸層
          由來:網絡層的ip幫咱們區分子網,以太網層的mac幫咱們找到主機嗎,可是隻找到主機有用嗎,是否是程序之間進行的溝通啊像QQ、瀏覽器和京東服務器,而後你們使用的都是應用程序,你的電腦上可能同時開啓qq,暴風影音,等多個應用程序,那麼咱們經過ip和mac找到了一臺特定的主機,如何標識這臺主機上的應用程序,答案就是端口,端口即應用程序與網卡關聯的編號。
           功能:創建端口到端口的通訊(端對端通訊)
補充:端口範圍0-65535,0-1023爲系統佔用端口
 
    TCP協議:(TCP把鏈接做爲最基本的對象,每一條TCP鏈接都有兩個端點,這種端點咱們叫作套接字(socket),它定義爲端口號拼接到IP地址即構成了套接字,例如,若IP地址爲192.3.4.16,而端口號爲80,那麼獲得的套接字爲192.3.4.16:80
 
當應用程序但願經過TCP與另外一個應用程序通訊時,他會發送一個通訊請求。這個請求必須被送到一個確切的位置。在雙方‘握手’以後,TCP將在兩個應用程序之間創建一個雙工(full-duplex,雙方均可以收發消息)的通訊。
 
這個全雙工的通訊將佔用兩個計算機之間的通訊線路,只到它被一方或雙方關閉爲之。
 
它是可靠傳輸,TCP數據包沒有長度限制,理論上能夠無限長,可是爲了保證網絡的效率,一般TCP數據包的長度不會超過IP數據包的長度,以確保單個TCP數據包沒必要再分割
 
以太網頭 IP頭 TCP頭 數據
 
 
UDP協議:不可靠傳輸,‘報頭’部分一共有8個字節,總長度不超過65635,正好放進一個IP數據包
 
以太網頭 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協議了。
TCP和UDP比較
 
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=19 復位RST,當RST=1,代表TCP鏈接中出現嚴重差錯,必須釋放鏈接,而後再從新創建鏈接;
10 同步SYN,在鏈接創建時用來同步序號。當SYN=1,ACK=0,代表是鏈接請求報文,若贊成鏈接,則響應報文中應該使SYN=1,ACK=111 終止FIN,用來釋放鏈接。當FIN=1,代表此報文的發送方的數據已經發送完畢,而且要求釋放;
12 窗口,佔2字節,指的是通知接收方,發送本報文你須要有多大的空間來接受;
13 檢驗和,佔2字節,校驗首部和數據這兩部分;
14 緊急指針,佔2字節,指出本報文段中的緊急數據的字節數;
15 選項,長度可變,定義一些其餘的可選的參數。
TCP報文首部
TCP三次握手和四次揮手
 
咱們知道網絡層,能夠實現兩個主機之間的通訊。可是這並不具體,由於真正進行通訊的實體是在主機中的進程,是一個主機中的一個進程與另一個主機中的一個進程再交換數據。IP協議雖然能把數據報文送到目的主機,可是並無交付給主機的具體應用進程。而端到端的同您才應該是應用進程之間的通訊。
 
UDP 在傳送數據前不須要先創建鏈接,遠地的主機在收到UDP報文後也不須要給出任何確認。雖然UDP不提供可靠交付,可是正是由於這樣,省去了不少開銷,使得它的速度比較快,好比一些對實時性要求比較高的服務,就經常使用UDP。對應的應用層的協議主要有DNS,TFTP,DHCP,SNMP,NFC等。
 
TCP,提供面向鏈接的服務,在傳送數據以前必須先創建鏈接,數據傳送完成以後要限制鏈接。所以TCP是一種可靠的運輸服務,可是正由於這樣,不可避免地增長了不少開銷,好比確認,流量控制等,對應的應用層的協議主要有SMTO,TELNET,HTTP,FTP等
 
經常使用的端口號
 
應用程序 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的客戶端遲遲沒有收到確認報文,覺得服務器沒有收到,此時從新向服務器發送這條報文,此後客戶端和服務器通過兩次握手完成鏈接,傳輸數據,而後關閉鏈接。此時此前滯留的那一次請求鏈接,網絡通暢了到達了服務器,這個報文本該是失效的,可是,兩次握手的機制將會讓客戶端和服務器再次創建鏈接,這將致使沒必要要的錯誤和資源的浪費。

若是採用的是三次握手,就算是那一次失效的報文傳送過來了,服務端接受到了那條失效報文而且回覆了確認報文,可是客戶端不會再次發出確認。因爲服務器收不到確認,就知道客戶端並無請求鏈接。
爲何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通常都會分開發送,從而致使多了一次。
爲何客戶端最後還要等待2MSL?

三次握手:
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創建的是全雙工通道,你和我斷了,我仍是能夠給你發消息的,因此你斷了以後,也須要我進行斷開連接,因此要進行四次揮手確認。
爲何是三次握手,四次揮手
⑤應用層
             由來:用戶使用的都是應用程序,均工做於應用層,互聯網是開發的,你們均可以開發本身的應用程序,數據多種多樣,必須規定好數據的組織形式
            功能:規定應用程序的數據格式。
例:TCP協議能夠爲各類各樣的程序傳遞數據,好比Email、WWW、FTP等等。那麼,必須有不一樣協議規定電子郵件、網頁、FTP數據的格式,這些應用程序協議就構成了」應用層」。
 
 
⑥socket
咱們知道兩個進程若是須要進行通信最基本的一個前提是可以惟一的標識一個進程,在本地進程通信中咱們可使用PID來惟一標識一個進程,但PID直在本地惟一,網路中兩個進程PID衝突概率很大。這個時候須要我麼另闢蹊徑了,咱們知道IP層的IP地址能夠惟一標識主機,erTCP層協議和端口號能夠惟一標識主機的一個進程,這樣咱們能夠利用IP地址+協議+端口號惟一標識網絡中的一個進程。
 
可以惟一標識網絡從此曾後,他們就能夠利用soaket進行通訊了,socket常被翻譯成套接字,socket是在應用層和傳輸層之間的抽象層,它把TCP/IP層複雜的抽象爲幾個簡單的接口供應層調用已實現進程在網絡中通訊。
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。套接字有兩種(或者稱爲有兩個種族),分別是基於文件型的和基於網絡型的。
socket詳解
基於文件類型的套接字家族
套接字家族的名字:AF_UNIX
unix一切皆文件,基於文件的套接字調用的就是底層的文件系統來取數據,兩個套接字進程運行在同一機器,能夠經過訪問同一個文件系統間接完成通訊
基於網絡類型的套接字家族
套接字家族的名字:AF_INET
(還有AF_INET6被用於ipv6,還有一些其餘的地址家族,不過,他們要麼是隻用於某個平臺,要麼就是已經被廢棄,或者是不多被使用,或者是根本沒有實現,全部地址家族中,AF_INET是使用最普遍的一個,python支持不少種地址家族,可是因爲咱們只關心網絡編程,因此大部分時候咱們只使用AF_INET)
socket的分類

 socket在內的5層通訊流程python

 

 

基於TCP和UDP兩個協議下socket的通信流程
 一、TCP和UDP對比
 
      TCP(Transmission Control Protocol)可靠的、面向鏈接的協議、傳輸效率低全雙工通訊(發送緩存&接收緩存),面向字節流。是喲個TCP的引用:web瀏覽器,文件傳輸程序
 
        UDP(User Datagram Protocol)不可靠的、無鏈接的服務、傳輸效率高,一對一,一對多,多對一,多對多,面向報文(數據包),盡最大努力服務,無阻塞控制。使用UDP的應用:域名系統(DNS),視頻流,IP語音(VoIP)。
 
查看下圖比對差別
 

 

 

TCP和UDP下socket差別對比圖程序員

 

 

 

1、TCP協議下的socket
 
基於TCP的socket通信流程圖片:

 

先從服務器提及,服務器端先初始化socket,而後與端口綁定(bind),對端口進行建通(listen),調用acceptzuse,等待客戶端鏈接。在這時若是有個客戶端初始化socket,而後鏈接服務器(connect),若是鏈接成功,這時客戶端與服務端的鏈接就創建了。客戶端發送請求數據,服務端接收請求並處理請求,而後把迴應數據發給客戶端,客戶端讀取數據,最後關閉鏈接,一次交互結束。
 
 
server端
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()
TCP_server.py
client端
TCP_client.py
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'))
TCP_client.py
上邊的代碼會有這種狀況:第一個鏈接的客戶端能夠和服務端收發消息,可是第二個鏈接的客戶端大消息服務端是收不到的,需等到第一個客戶端斷了以後,才能收到第二個客戶端發的消息
 
緣由:
 TCP屬於長鏈接,長鏈接就是一直佔用着這個鏈接,這個鏈接的端口被佔用了,第二個客戶端過來鏈接的時候,他是能夠鏈接的,可是處於一個佔線的狀態,就只能等着去跟服務器創建鏈接,除非一個客戶端斷開以後,而後就能夠進行和服務端的通訊了。
 
 
2、UDP協議下的socket
 
基於UDP的socket通信流程
 

 

 

流程:服務器先初始化socket,而後與端口綁定(bind),recvform接收消息,這個消息有兩項,消息內容和對方客戶端的地址,而後回覆消息的時候也要帶着你收到的這個客戶端地址,發送回去,最後關閉鏈接,一次交互結束。
 
簡單例子
 
server端:
 
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)
udp_server.py
client端:
 
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)
udp_client.py
 
簡單對話:
 server端
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()
udp_server02.py
cilent端: 
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()
udp_client02.py
相關文章
相關標籤/搜索