以前也整理過吧,寫了幾篇之後,感覺沒啥整理的必要了然後就放棄了,最近又想整理一下。
這篇對應的是:可以說是這篇的重寫吧。
首先介紹一下什麼是socket的,如果搞學術的不知道,他們可能要求的比較嚴,但是對於碼農來說,socket可以說是向作業系統申請網路資源。
這個資源可以讓我們傳送資料和接收資料,這樣就可以了。就像我們上面那篇文章寫的,作業系統就是服務端,我們寫的都是客戶端,我們做的就是和服務端打交道。
就跟前後端一樣,後端告訴你乙個token,然後前端總糾結這個token是啥,我覺得大可不必,你傳給我服務端我就給你過唄。
有時候我們要放大我們的思維,有時候我們要縮小自己的思維。 如果從客戶端的角度去考慮socket,就跟前端去考慮token 是一樣的,又痛苦又無趣。當你花點時間去了解後端,這個問題自然就解了。天生萬物,道法自然,一切都是機緣,不要強求。
現在了解了,socket 就是資源。
有了作業系統給我們的socket 的資源後,我們就可以做一些其他事情了。
比如我們告訴作業系統,我們要占用127.0.0.1 的 8888 埠。
那麼我們可以使用bind 來告訴作業系統。以前我有個誤區,就是乙隻理解bind為繫結的意思,後面我理解的是應該是申請的意思。
要申請這個127.0.0.1 8888這個資源。所以如果有乙個程式申請了這個資源,其他程式就不能申請了。
但是我們知道,這個返回的socket 是個描述符,假如我們的這個描述符給其他程式使用,那麼是否能共享這個資源呢?
如果這個成立,那麼一切都回到了資源這個話題,而不能再說什麼占用的情況,什麼程式之間不能公用乙個網路的情況。
這個後面提及,不然一直往外推,就太大了。
現在回到了socket這個話題了。bind 申請了這個套接字占用了某個網路資源了。
那麼為何我們要進行listen呢? bind 是資源占用,現在作業系統記錄了這個網路資源屬於某個socket了,其他socket就不能占用了。
但是有個問題,就是占用相當於作業系統內部的操作。作業系統可沒有說要處理收到的訊息啊。
作業系統處理訊息相當於流水線,訊息過來了,但是我們的指揮部還沒要處理到127.0.0.1 8888位址的訊息啊。
那麼listen 就是告訴流水線,處理一下127.0.0.1 8888的訊息,有到這個的位址的包裹存一下。
那麼現在流水線上的資源會被存起來了,但是這個是存到了作業系統了,還沒到我們的程式。
這個時候客戶端程式已經可以傳送連線和訊息到我們作為伺服器申請了127.0.0.1 8888的這台機器了。
前面說了包裹還在我們作業系統那裡,那麼就得問一下(accept),有沒有人發包裹給我。
然後作業系統如果有的話,就會告訴隔壁家的大爺發了點東西給你。
這個時候你就會拿到客戶端會話,然後給作業系統說接受一下(receive)包裹吧。
這個時候我們思考一下問題,那就是tcp是雙向通訊的,這個時候我要收大爺包裹的時候,突然大爺掉線了,tcp斷了。
請問這個時候作業系統還會給我包裹嗎?
遠端主機強迫關閉了乙個現有的連線。
這時候你就會收到上面這個,這個時候作業系統就不給你快取的包裹了,至於作業系統啥時候清空快取這是作業系統幹的事情。
這個時候再思考另外乙個問題,如果是大爺發了包裹給我,然後又斷開了。這個時候我們才開始進行accept,作業系統還會告訴我們大爺給過包裹嗎?
是會的,來電顯示還是會給的。
這大概就是基本的tcp 通訊了。
自己寫的測試** .net 6:
service:
// see for more information
using system.net;
using system.net.sockets;
var socket = new socket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp);
var ipaddress = ipaddress.parse("127.0.0.1");
endpoint endpoint = new ipendpoint(ipaddress, 8888);
socket.bind(endpoint);
socket.listen();
console.readline();
var clientsocket = socket.accept();
var receivemessage = new byte[1000];
clientsocket.receive(receivemessage);
console.writeline(system.text.encoding.utf8.getstring(receivemessage));
console.readline();
client:
// see for more information
using system.net;
using system.net.sockets;
var socket = new socket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp);
var ipaddress = ipaddress.parse("127.0.0.1");
endpoint endpoint = new ipendpoint(ipaddress, 8888);
socket.connect(endpoint);
socket.send(system.text.encoding.utf8.getbytes("hello service"));
console.readline();
以上只是個人理解,可能存在錯誤,望請指出。 計算機網路原理整理(計算機網路概述)
計算機網路是利用通訊裝置與通訊鏈路或者通訊網路,互聯位置不同 功能自治的計算機系統,並遵循一定的規則事項的計算機系統之間的資訊互動。概括 計算機網路是互聯的 自治的計算機的集合。按地理範圍 廣域網,都會網路,區域網 按傳輸介質 雙絞線,同軸電纜,光纖,無線網 按拓撲結構分 星,環,匯流排,樹,網 按...
計算機網路再次整理 tcp的關閉 七
tcp的關閉不是簡單粗暴的,相對而言是友好優雅的,好聚好散吧。那麼友好的關閉方式是這樣的 假設這裡是客戶端請求關閉的,服務端倒過來。客戶端 我要請求關閉 服務端 我接收到你的請求了,等我把要發的資料發完。服務端 我要發的資料發完了,可以關閉了。客戶端 好的,我已經執行清理工作了,關閉結束。那麼這個時...
計算機網路知識整理
計算機連網方法後兩種最終還是匯流排網 路由器將不同的計算機網路互連起來所以互連網是由許多網路通過互聯而成 網路的網路 計算機網路可以抽象為結點 計算機路由器 與鏈路 連線的線路 的集合 internet與internet 計算及網路頻寬與寬頻 電路交換 分組交換 儲存 注意 網際網路次啊用基於儲存 ...