TCP&UDP&Socket講解(上)


這兩天我將整理TCP&UDP&Socket,大約花大家10-15分鍾之間,希望本篇文章讓大家對TCP使用的理解提高一個層次。

 建議大家拿出紙和筆,畫一下!!!

一、TCP

1. TCP位於傳輸層,英語全稱為Transmission Control Protocol ,又名傳輸控制協議;UDP英語全稱為User Datagram Protocol,又名用戶數據報協議。

看到一個名詞(紅色標出)傳輸層,在講解傳輸層之前,我們看一下協議的體系結構如下圖:

摘自計算機網絡第七版第一章圖

  • OSI的七層協議體系結構的概念更清楚,也比較完整,但是因為復雜又不太使用
  • TCP/IP是四層體系結構,應用層,運輸層,網際層以及網絡接口層,但是網絡接口層並沒有太多的實際內容
  • 所以在我們使用總采取折中的辦法,綜合了OSI和TCP/IP的優點,采用一種五層協議的體系結構

2. 五層協議的體系結構

摘自計算機網絡第七版第一章圖

  1. 應用層:為用戶的應用程序直接提供服務;HTTP、SMTP等協議,數據單元為報文
  2. 運輸層:負責的任務就是兩個主機中進程之間的通訊提供數據傳輸服務,TCP或者UDP,數據單元為報文段,用戶數據報
  3. 網絡層:負責在分組交換網上的不同主機提供了通信服務,IP等協議,數據單元為分組(IP數據報、數據報)
  4. 數據鏈路層:將網絡層傳下的數據報組裝成幀並傳送
  5. 物理層:傳送比特流,數據單元:比特

 3.端口

  1. 服務器端使用的端口號
  • 熟知端口,也就是數值一般為0~1023
  • 登記端口號:數值為1024~49151,為沒有熟知端口號的程序所使用的,但是使用這個范圍的端口號必須在IANA機構上進行登記,為了防止重復

  2.客戶端的所使用的端口號

  • 此端口號也稱為短暫端口號,數值為49152~65535,留給客戶進程選擇暫時使用的。

下圖為常用的熟知端口號圖:

摘自計算機網絡第七版第5章圖

4.TCP連接建立

  1. TCP建立連接的過程叫做握手。
  2. 握手是需要客戶和服務器之間交換三個TCP報文段,稱為三報文握手。
  3. 采用三次握手主要是為了防止已經失效的連接請求報文段突然又開始工作啦,因而發生錯誤,為了保證可靠性傳輸。

下面連接TCP的三次握手的示意圖,並加以解釋,建議大家拿出一張紙,畫出這個結構。

三次握手的第一次

 

三次握手的第二次

 

三次握手的第三次

5. TCP的連接釋放

  1. 數據傳輸結束后,通信的雙方都可以把連接進行釋放。
  2. TCP連接的釋放需要四報文握手,也就是四次握手。

下面連接TCP的四次握手的示意圖,並加以解釋,建議大家拿出一張紙,畫出這個結構。

釋放連接第一步

 

釋放連接第二步

 

 

釋放連接第三步

 

 

釋放連接第四步

 

拓展>>

  1. TCP建立連接為什么是三次握手,關閉連接是四次握手?
  • 關閉連接的時候,當收到對方的FIN報文通知的時候,它的意思僅僅是表示對方沒有數據發送給你了;但是未必你所有要發送的數據全部都發給對方了,所以未必會馬上關閉Socket連接,也是你需要放松一些數據給對方,再然后發送FIN報文給對方表示同意現在關閉Socket連接,在這里ACK報文和FIN報文大多數情況是分開發送,這樣就解釋關閉連接是四次握手啦。

 上面講述了TCP的連接和釋放的基本過程,下面我們來講解另一個重要的知識點Socket。

 

二、Socket

2.1 Socket概念

Socket又名套接字,是通信的基石,也是來支持TCP/IP協議的網絡通信操作的基本單元。應用層這樣可以和傳輸層協議通過Socket接口,來區分不同程序進程或者網絡的通信,以此來實現網絡傳輸的並發。

 

2.2 Socket連接

2.2.1 Socket的建立連接至少需要一對套接字來完成,一個運行於客戶端,也被我們稱為ClientSocket,一個運行於服務器端,也被叫為ServerSocket。

 

2.2.2 Socket的連接過程有三個步驟

  1. 服務器監聽
  2. 客戶端請求
  3. 連接確認

(1)服務器監聽:服務器的套接字並不定位具體的來自客戶端的套接字,而是一種等待連接的狀態,通過實時監控網絡狀態,來等待客戶端的連接請求。

(2)客戶端請求:指ClientSocket發起連接請求,請求要連接到ServerSocket,在這其中需要指出ServerSocket的地址和端口號,這樣向服務器ServerSocket提出發出請求。

(3)當ServerSocket監聽到ClientSocket發送過來的套接字請求時,就響應客戶端套接字請求,建立一個線程,把ServerSocket描述發給客戶端,一旦Client確認了,雙方就建立連接。

 

2.2.3 下面看一下Socket編程原理圖(細看)

Socket工作圖

 (1)server(服務器必要代碼)

  1. fd=socket(int domain,int type,int protocol)

  上面fd代表是這個服務器,也可以說獲得了一個標識,可以通過fd訪問到該服務器。下面講解參數

  • domain:協議族或者協議域。
  • type:指定了socket類型。
  • protocal:指定了協議,TCP協議,UDP協議。

  2. int bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen)--bind翻譯中文為綁定

  意思是把上面socket()出來的標志符fd和真實的服務器地址進行綁定。

  • sockfd:就是上面的那個fd
  • addr:表示要綁定的地址(服務器端的ip和端口),所以我們調用blind函數之前需要我們首先設置一下結構體
  • addrlen:代表對應地址的長度
  • 返回值:失敗返回-1 ,成功則返回0

  3. int listen(intsocketfd,intbacklog)

  此函數調用后,當client客戶端調用一個叫connect函數,connect發出連接請求時,服務器會收到請求。如果Listen函數一旦調用,fd就將變成被動的套接字(以后只能等別人來連接,自己不能主動發出連接)

  • socketfd:是1中的fd
  • backlog:可以排隊的最大連接個數

  4. int accept( int sockfd,structsockaddr *addr , socklen_t *addrlen)

  代表從已完成的連接隊列的返回第一個連接,如果已經完成的連接隊列為空,則會阻塞。

  • sockfd:就是1中fd
  • addr:獲得對方的地址存在這個結構中,這個地址指的是客戶端的地址
  • addrlen:代表地址長度
  • 返回值:失敗返回-1 ,成功時返回客戶端的fd

  5.recv()/send()或者read()/write()

  都是為了數據的收發操作

 

(2)Client(客戶端)

  1. fd = socket()

  目的是獲得客戶端的唯一標識fd

  2. int connect(int sockfd,const struct sockaddr *addr,socklen_t addrlen)

  目的是把客戶端連接到服務器,調用此函數后服務器的accept函數就會收到這個連接。

  • sockfd:相當於客戶端的唯一標識fd
  • addr:代表要連接的服務器地址
  • 返回值:失敗-1,成功0

  3. recv()/send()或者read()/write()

  解釋同上

 

本篇博客主要是一些概念性問題,希望對大家對TCP&UDP&Socket的認識有所增加,下篇將講述TCP-Socket使用和講解!!!


免責聲明!

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



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