成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

背了一年的計網八股,還不知道什么是 Socket?

開發 前端
小區類比于 IP 地址,門牌號類比于端口號,IP 地址 + 端口號(小區 + 門牌號) 就能唯一確定一個程序。光有小區不行,光有門牌號也不行,所以這就是為什么說網絡層負責建立主機到主機的通信(IP 地址),傳輸層負責建立端口到端口的通信(端口號)了。

?前言

不明白 Socket 是什么的主要原因其實就是沒有實際的網絡編程經驗,就沒有在代碼里用過 Socket,背來背去還是腦袋一片漿糊,很正常,看完這篇文章肯定就清楚了(狗頭)

TCP 四元組

要說 Socket,那當然不能繞過 TCP 了,各位不妨先來思考下如何確定一個 TCP 連接?

以小黑和小白為例,他們分別位于不同的小區,小黑找小白玩,需要知道小白的小區和門牌號,也就是說,小區 + 門牌號就是小白家的入口,知道了這個入口,小黑就能找到小白。反之也是同樣的。

小區類比于 IP 地址,門牌號類比于端口號,IP 地址 + 端口號(小區 + 門牌號) 就能唯一確定一個程序。光有小區不行,光有門牌號也不行,所以這就是為什么說網絡層負責建立主機到主機的通信(IP 地址),傳輸層負責建立端口到端口的通信(端口號)了。

這個很好記憶,你上線一個網站的時候,如果沒有綁定域名的話,那么就只能通過 IP 地址 + 端口號(默認是 80,瀏覽器上不顯示)訪問。

總結下就是,TCP 四元組可以唯一的確定一個連接,四元組包括如下:

  • 目的 IP 地址
  • 目的端口
  • 源 IP 地址
  • 源端口

圖片

其中:

  • IP 地址(源地址和目的地址,32位)是在 IP 頭部中
  • 端口號(源端口和目的端口,16位)是在 TCP 頭部中

Socket

掌握了四元組這個基本概念,我們再來解釋 Socket。

上文說過,小區 + 門牌號是住宅的入口,IP 地址 + 端口號是一個程序的入口,這個入口就是 Socket,那么服務端和客戶端之間想要進行通信,只要互相暴露出自己的入口(Socket),就能夠找到彼此了。

更嚴謹來說,Socket 封裝了基本的通信功能,是 TCP/IP 協議的基本操作單元。

以 Java 中的 Socket? 類為例,服務端和客戶端首先都需要調用構造函數創建 Socket 暴露自己的入口(綁定 IP 地址和端口,也可以調用 bind 方法進行綁定)

圖片

光暴露了入口還不行,你還得豎起耳朵聽,不然別人來敲門你聽不見那也沒法通信啊,所以接下來服務端調用 accept() 方法,該方法將一直等待,直到客戶端請求服務端的入口,再就是 TCP 三次握手建立連接的過程了。

服務端 Socket 創建一般使用 ServerSocket 類,該類提供了非常重要的 accept(建立連接) :

圖片

那客戶端是如何請求服務端的入口的呢?也就是是如何發起連接的呢,客戶端在創建好 Socket 后,調用 connect(host, port) 函數發起連接,該函數需要指明服務端的 IP 地址和端口號。

圖片

所以說,TCP 三次握手其實是發生在客戶端 connect? 和服務端 accept? 兩個函數之間。握手完了就可以通過 read()? 和 write() 來通信啦。這里需要重點注意的是:監聽的 Socket 和真正用來傳數據的 Socket 是兩個不同的 Socket:

  • 一個是 監聽 Socket;
  • 一個是 已連接 Socket;

看下上述的 ServerSocket.accept? 方法就明白了,accept會返回一個 Socket 對象,后續服務端和客戶端之間的數據傳輸都用這個 Socket:

圖片

事實上,在三次握手的過程中,內核(Kernel)為每個連接都維護了兩個隊列:

  • TCP 半連接隊列:這個隊列存儲沒有完成三次握手的 Socket,此時服務端處于 syn_rcvd 的狀態;
  • TCP 全連接隊列:這個隊列存儲已經完成了三次握手的 Socket,此時服務端處于 established 狀態;

當 TCP 全連接隊列不為空后,服務端的 accept() 函數,就會從內核中的 TCP 全連接隊列里拿出一個已經完成連接的 Socket 并返回,用于后續服務端和客戶端的通信。

總結

綜上, 基于 TCP 協議的 Socket 調用過程就結束了,下面由貼心助理 ChatGPT 總結下:

以下全是 ChatGPT 生成的結果,沒有一個字是我寫的(??),雖然是我引導了很多輪的結果,但是輸入合適的 Promt 并配合上下文 ChatGPT 基本能輸出 90% 想要的內容,確實太強了

文字解釋:

圖片

圖片

代碼示例:

圖片

客戶端代碼示例

圖片

服務器端代碼示例

由于我懶得畫圖,所以決定再讓 ChatGPT 幫我生成下,雖然結果不是很行,不過還是能看,不用我費勁畫了,舒服!

圖片

在上面的流程圖中,Socket 客戶端和服務端之間的通信過程如下:

  1. 客戶端創建一個 Socket 對象,指定服務端的 IP 地址和端口號,然后調用 connect() 方法發起連接請求。
  2. 服務端創建一個 ServerSocket 對象,并指定端口號,然后調用 accept() 方法等待客戶端連接請求。
  3. 當客戶端的連接請求到達服務端,服務端的 accept() 方法會返回一個新的 Socket 對象,該 Socket 對象代表了客戶端和服務端之間的通信連接。
  4. 客戶端可以通過該 Socket 對象的 getOutputStream()? 方法獲取輸出流對象,用于向服務端發送數據;也可以通過該 Socket 對象的 getInputStream() 方法獲取輸入流對象,用于接收服務端發送的數據。
  5. 服務端可以通過該 Socket 對象的 getOutputStream()? 方法獲取輸出流對象,用于向客戶端發送數據;也可以通過該 Socket 對象的 getInputStream() 方法獲取輸入流對象,用于接收客戶端發送的數據。
  6. 客戶端和服務端可以通過各自的輸出流和輸入流進行數據的讀寫操作。
  7. 當通信完成后,客戶端和服務端都需要調用該 Socket 對象的 close() 方法關閉連接。
責任編輯:武曉燕 來源: 飛天小牛肉
相關推薦

2021-10-22 09:41:26

橋接模式設計

2023-01-02 10:08:42

StampedLocAQS框架

2019-12-24 09:49:02

微軟英語瀏覽器

2021-04-08 10:23:55

5G移動邊緣計算MEC

2016-07-22 17:55:07

云計算

2021-04-15 12:30:18

ServletSpringMVC 版本

2022-07-17 06:53:24

微服務架構

2022-09-19 18:32:22

函數編程語言

2024-08-02 16:31:12

2021-10-08 06:10:43

前端技術Vue

2010-03-12 09:15:28

Firefox新功能

2022-05-05 12:02:45

SCSS函數開發

2020-12-14 07:51:16

JS 技巧虛值

2018-09-02 15:43:56

Python代碼編程語言

2023-11-29 17:28:07

2023-03-03 07:40:52

MySQLSQL命令

2022-04-12 09:04:57

前端監控數據采集

2019-12-25 14:20:01

Zookeeper框架大數據

2014-12-01 09:41:25

2021-03-18 14:02:56

iOS蘋果細節
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: h视频免费观看 | 草久在线视频 | 久久久蜜桃一区二区人 | 久久99精品久久久久婷婷 | 日韩一区二区在线观看 | 伊人久久免费 | 国产精品视频一 | 性生生活大片免费看视频 | 综合激情av| 国产欧美一区二区久久性色99 | 91久久国产综合久久 | 国产在线中文字幕 | 天天操综合网站 | www久久爱 | 亚洲欧美综合网 | 黄色大片免费网站 | 久久精品在线免费视频 | 免费视频99 | 久久精品免费 | 亚洲一区二区三区免费观看 | 麻豆精品久久久 | 亚洲精品在线观看视频 | 国产精品夜夜春夜夜爽久久电影 | 国产激情视频在线观看 | 婷婷在线视频 | 中国一级大黄大片 | 国产精品久久久久免费 | 国产一区二区中文字幕 | 久久精品一 | 午夜精品一区二区三区在线视 | 男女爱爱福利视频 | 91久久国产综合久久 | 91精品国产综合久久小仙女图片 | 日韩国产免费观看 | 日韩欧美国产综合 | 午夜在线影院 | 久久久久久久一级 | 久久久精品视频免费看 | 91精品久久久久 | 成人国产精品 | 91精品国产91久久久久久 |