Socket基礎(chǔ)知識(shí)有哪些-創(chuàng)新互聯(lián)

本篇文章給大家分享的是有關(guān)Socket基礎(chǔ)知識(shí)有哪些,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

成都創(chuàng)新互聯(lián)客戶(hù)idc服務(wù)中心,提供服務(wù)器托管、成都服務(wù)器、成都主機(jī)托管、成都雙線服務(wù)器等業(yè)務(wù)的一站式服務(wù)。通過(guò)各地的服務(wù)中心,我們向成都用戶(hù)提供優(yōu)質(zhì)廉價(jià)的產(chǎn)品以及開(kāi)放、透明、穩(wěn)定、高性?xún)r(jià)比的服務(wù),資深網(wǎng)絡(luò)工程師在機(jī)房提供7*24小時(shí)標(biāo)準(zhǔn)級(jí)技術(shù)保障。

如何一步步掌握Socket相關(guān)的知識(shí)。

什么是Socket?

大家都用電腦上網(wǎng),當(dāng)我們?cè)L問(wèn)運(yùn)維社區(qū)https://www.unixhot.com的時(shí)候,我們的電腦和運(yùn)維社區(qū)的服務(wù)器就會(huì)創(chuàng)建一條Socket,我們稱(chēng)之為網(wǎng)絡(luò)套接字。那么既然是網(wǎng)絡(luò)通信,肯定是成對(duì)的。至少有一個(gè)客戶(hù)端和服務(wù)端,我們稱(chēng)之為套接字對(duì)。

一個(gè)套接字對(duì)(socket pair)是一個(gè)定義該網(wǎng)絡(luò)連接的兩個(gè)端點(diǎn)的五元組,包括:

  1. 源IP地址

  2. 源端口

  3. 目的IP地址

  4. 目的端口

  5. 類(lèi)型:TCP or UDP

那么針對(duì)于HTTP請(qǐng)求來(lái)說(shuō),我們知道底層是建立了一條TCP的Socket,那么TCP的套接字對(duì)就是一個(gè)四元組,因?yàn)閰f(xié)議已經(jīng)確定了:

1.源IP地址、2.源端口、3.目的IP地址、4.目的端口。

客戶(hù)端的隨機(jī)端口

為了更直觀的認(rèn)識(shí)這個(gè)TCP Socket,我們做一個(gè)小實(shí)驗(yàn),我這里準(zhǔn)備了兩臺(tái)服務(wù)器:

角色

IP地址

端口

客戶(hù)端

192.168.56.11

隨機(jī)

服務(wù)端

192.168.56.12

9999

   當(dāng)客戶(hù)端192.168.56.11訪問(wèn)192.168.56.12的9999端口的時(shí)候,那么會(huì)選擇一個(gè)隨機(jī)端口來(lái)進(jìn)行通信,那么這個(gè)隨機(jī)端口,到底是從什么范圍隨機(jī)出來(lái)了呢,端口總有一個(gè)范圍不可能無(wú)窮多的。

    那么對(duì)于TCP套接字來(lái)說(shuō)客戶(hù)端的一個(gè)IP地址,到底能有多少個(gè)端口呢?由于TCP協(xié)議頭部使用16位來(lái)保存端口號(hào),所以端口的個(gè)數(shù)最多為65536個(gè),2^16=65536。

   Socket基礎(chǔ)知識(shí)有哪些

沒(méi)錯(cuò),是65536個(gè)。但是為什么我們經(jīng)常看到網(wǎng)上說(shuō)可用端口大65535個(gè)呢,也就是2^16-1個(gè)。因?yàn)槎丝谔?hào)是從0開(kāi)始算的,0-65535那就是65536個(gè)。而0端口是保留端口,無(wú)論是TCP還是UDP都是不用使用的,當(dāng)然這個(gè)是標(biāo)準(zhǔn),那到底能不能監(jiān)聽(tīng)端口0呢,下面我用一個(gè)python腳本,監(jiān)聽(tīng)本地的端口0來(lái)試試。

[root@test ~]# catbind_port_zero.py

#!/usr/bin/env python

# -*- coding: utf-8 -*-

'''本腳本監(jiān)聽(tīng)本地的127.0.0.1的端口0,

探索端口0的奧秘'''

import socket

def bind_port_zero():

    ss = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

    ss.bind(('127.0.0.0', 0))

    addr, port = ss.getsockname()

    ss.close()

    print(addr, port)

bind_port_zero()

執(zhí)行腳本,看看到底能不能正常監(jiān)聽(tīng):

[root@test ~]# pythonbind_port_zero.py

('127.0.0.0', 53692)

[root@test ~]# pythonbind_port_zero.py

('127.0.0.0', 59444)

可以發(fā)現(xiàn),可以正常監(jiān)聽(tīng),但是呢并沒(méi)有監(jiān)聽(tīng)到端口0。實(shí)驗(yàn)證明在Linux下如果在bind的時(shí)候指定端口0,那么由系統(tǒng)隨機(jī)選擇一個(gè)可用端口來(lái)bind。

好的,我們現(xiàn)在知道了端口的范圍0-65535,那么作為客戶(hù)端訪問(wèn)其它服務(wù)端的時(shí)候,能用多少呢?并不是這個(gè)范圍都可以用的。那么在Linux下我們可以這么獲取本地的隨機(jī)端口范圍:

[root@test ~]# cat/proc/sys/net/ipv4/ip_local_port_range

32768     61000

    不要驚訝答案確實(shí)是32768到61000,現(xiàn)在你應(yīng)該明白,別人說(shuō)的發(fā)10萬(wàn)并發(fā)進(jìn)行壓力測(cè)試代表什么意思了吧。至少默認(rèn)情況下是無(wú)法實(shí)現(xiàn)的,讀完這句話,是否有啟發(fā)呢?并不是不能實(shí)現(xiàn)哦。

瓶頸真的只有隨機(jī)端口范圍嗎?

剛才我們也看了,我們?cè)L問(wèn)其它服務(wù)器,作為客戶(hù)端,我們要使用一個(gè)隨機(jī)端口,32768-61000,貌似也不少,當(dāng)然你還可以修改它,擴(kuò)大隨機(jī)端口范圍。例如我們使用Nginx做反向代理負(fù)載均衡的時(shí)候,用戶(hù)端和Nginx建立Socket進(jìn)行通信,Nginx還需要和后端真實(shí)服務(wù)器也建立Socket進(jìn)行通信,在高并發(fā)的場(chǎng)景下,這個(gè)隨機(jī)端口肯定是一個(gè)瓶頸。但是真的只有隨機(jī)端口范圍是瓶頸嗎?下面我們使用ab命令來(lái)對(duì)百度進(jìn)行一次壓力測(cè)試。

ab是Apache的性能測(cè)試工具,可以模擬并發(fā)進(jìn)行Web性能測(cè)試。在CenotOS下,你可以這樣來(lái)安裝:

[root@test ~]# yuminstall -y httpd-devel

按照咱們之前的認(rèn)識(shí),隨機(jī)端口61000-32768=28232,那么我實(shí)驗(yàn)的機(jī)器是一臺(tái)剛安裝的系統(tǒng),沒(méi)有什么網(wǎng)絡(luò)傳輸,即便有,我們創(chuàng)建2萬(wàn)個(gè)套接字對(duì)應(yīng)該是沒(méi)問(wèn)題吧。事實(shí)真的如此嗎?我們用實(shí)驗(yàn)來(lái)證明:

我們模擬發(fā)送2萬(wàn)個(gè)請(qǐng)求,2000的并發(fā)來(lái)測(cè)試百度:

[root@test ~]#ab -n 10000 -c 2000 https://www.baidu.com/

This isApacheBench, Version 2.3 <$Revision: 1430300 $>

Copyright 1996Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/

Licensed to TheApache Software Foundation, http://www.apache.org/

Benchmarkingwww.baidu.com (be patient)

socket: Toomany open files (24)

這不可能,為什么報(bào)錯(cuò)了?不要擔(dān)心,報(bào)錯(cuò)我們很容易看懂了socket: Too many open files (24)

,不能打開(kāi)太多的文件。我們使用ulimit來(lái)看看系統(tǒng)資源限制。

[root@test ~]# ulimit -a

core file size          (blocks, -c) 0

data seg size           (kbytes, -d) unlimited

scheduling priority             (-e) 0

file size               (blocks, -f) unlimited

pending signals                 (-i) 31219

max locked memory       (kbytes, -l) 64

max memory size         (kbytes, -m) unlimited

open files                      (-n) 1024

(省略部分輸出)

沒(méi)錯(cuò),默認(rèn)情況下,當(dāng)前用戶(hù)能夠打開(kāi)的文件數(shù)量大是1024,但是這個(gè)和我們使用ab測(cè)試有什么關(guān)系呢?ab測(cè)試創(chuàng)建的不是socket嗎?如果你不理解,那就要回歸本質(zhì),想想我們剛剛學(xué)習(xí)Linux的時(shí)候,經(jīng)常聽(tīng)到的一句Linux的思想“一切皆文件”!誰(shuí)說(shuō)socket不是一個(gè)文件呢?

我相信你知道怎么做了,你可以使用ulimit –n來(lái)修改當(dāng)前用戶(hù)、當(dāng)前session的限制,也可以修改配置文件/etc/security/limits.conf來(lái)徹底解決這個(gè)問(wèn)題,這也是進(jìn)行系統(tǒng)性能調(diào)優(yōu)的必備基礎(chǔ)。


創(chuàng)建一條TCP Socket

好的,剛才只是一個(gè)小插曲,我們繼續(xù)探索TCP Socket,光說(shuō)不練是個(gè)棒槌。我們來(lái)創(chuàng)建一個(gè)套接字對(duì)看看:

服務(wù)端:

首先,我們?cè)?92.168.56.12上使用nc命令,來(lái)監(jiān)聽(tīng)9999端口。

[root@192.168.56.12 ~]#nc -l -4 -p 9999 -k

[root@192.168.56.12 ~]#netstat -ntlp | grep 9999

tcp        0     0 0.0.0.0:9999     0.0.0.0:*      LISTEN     26789/n

客戶(hù)端:

在客戶(hù)端,同樣使用nc命令來(lái)連接到服務(wù)端的9999端口。

[root@192.168.56.11 ~]#nc 192.168.56.12 9999

好的,現(xiàn)在你可以在客戶(hù)端上輸入任何的語(yǔ)言和服務(wù)端愉快的聊天了?不過(guò)這不是重點(diǎn)。

查看Socket

我們先來(lái)看看客戶(hù)端的TCPSocket。

[root@192.168.56.11 ~]#netstat -na | grep 9999

tcp    0     0 192.168.56.11:11525    192.168.56.12:9999     ESTABLISHED

服務(wù)端的TCP Socket

[root@192.168.56.12 ~]#netstat -na | grep 9999

tcp    0     0 0.0.0.0:9999           0.0.0.0:*               LISTEN    

tcp    0     0 192.168.56.12:9999     192.168.56.11:11525    ESTABLISHED

我相信你已經(jīng)真正理解了Socket,剩下的就是無(wú)盡的想象,還記得TIME_WAIT嗎?如果有大量的TIME_WAIT存在,那么這個(gè)套接字對(duì)是不釋放的,不釋放也就代表著占用一個(gè),資源嘛,占用一個(gè)就少一個(gè)。怎么優(yōu)化呢?且聽(tīng)下回分解!

    不過(guò),如果你真的理解了Socket的概念,你已經(jīng)有了一個(gè)終極解決方案。既然一個(gè)TCP Socket是一個(gè)四元組,那如果我這臺(tái)機(jī)器有多個(gè)IP地址呢?哈哈,這是一句畫(huà)龍點(diǎn)睛之語(yǔ),你懂的!

使用偽終端發(fā)送數(shù)據(jù)

最后,留一個(gè)小彩蛋,除了使用nc進(jìn)行數(shù)據(jù)發(fā)送之外,其實(shí)Linux還提供了一種稱(chēng)之為偽設(shè)備的方式,讓我們來(lái)體驗(yàn)下/dev下面的tcp偽設(shè)備。/dev下面提供了很多的偽設(shè)備,比如tcp就可以用來(lái)直接進(jìn)行遠(yuǎn)程端口的訪問(wèn)。

[root@192.168.56.11 ~]# echo"886" > /dev/tcp/192.168.56.12/9999

趕緊看看服務(wù)端有沒(méi)有收到886。

以上就是Socket基礎(chǔ)知識(shí)有哪些,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道。

網(wǎng)頁(yè)題目:Socket基礎(chǔ)知識(shí)有哪些-創(chuàng)新互聯(lián)
分享網(wǎng)址:http://muchs.cn/article36/dpispg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、Google、品牌網(wǎng)站制作、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)App開(kāi)發(fā)、域名注冊(cè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁(yè)設(shè)計(jì)公司