欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

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

本篇文章給大家分享的是有關Socket基礎知識有哪些,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

成都創(chuàng)新互聯(lián)客戶idc服務中心,提供服務器托管、成都服務器、成都主機托管、成都雙線服務器等業(yè)務的一站式服務。通過各地的服務中心,我們向成都用戶提供優(yōu)質廉價的產品以及開放、透明、穩(wěn)定、高性價比的服務,資深網絡工程師在機房提供7*24小時標準級技術保障。

如何一步步掌握Socket相關的知識。

什么是Socket?

大家都用電腦上網,當我們訪問運維社區(qū)https://www.unixhot.com的時候,我們的電腦和運維社區(qū)的服務器就會創(chuàng)建一條Socket,我們稱之為網絡套接字。那么既然是網絡通信,肯定是成對的。至少有一個客戶端和服務端,我們稱之為套接字對。

一個套接字對(socket pair)是一個定義該網絡連接的兩個端點的五元組,包括:

  1. 源IP地址

  2. 源端口

  3. 目的IP地址

  4. 目的端口

  5. 類型:TCP or UDP

那么針對于HTTP請求來說,我們知道底層是建立了一條TCP的Socket,那么TCP的套接字對就是一個四元組,因為協(xié)議已經確定了:

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

客戶端的隨機端口

為了更直觀的認識這個TCP Socket,我們做一個小實驗,我這里準備了兩臺服務器:

角色

IP地址

端口

客戶端

192.168.56.11

隨機

服務端

192.168.56.12

9999

   當客戶端192.168.56.11訪問192.168.56.12的9999端口的時候,那么會選擇一個隨機端口來進行通信,那么這個隨機端口,到底是從什么范圍隨機出來了呢,端口總有一個范圍不可能無窮多的。

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

   Socket基礎知識有哪些

沒錯,是65536個。但是為什么我們經常看到網上說可用端口大65535個呢,也就是2^16-1個。因為端口號是從0開始算的,0-65535那就是65536個。而0端口是保留端口,無論是TCP還是UDP都是不用使用的,當然這個是標準,那到底能不能監(jiān)聽端口0呢,下面我用一個python腳本,監(jiān)聽本地的端口0來試試。

[root@test ~]# catbind_port_zero.py

#!/usr/bin/env python

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

'''本腳本監(jiān)聽本地的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)聽:

[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)聽,但是呢并沒有監(jiān)聽到端口0。實驗證明在Linux下如果在bind的時候指定端口0,那么由系統(tǒng)隨機選擇一個可用端口來bind。

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

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

32768     61000

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

瓶頸真的只有隨機端口范圍嗎?

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

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

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

按照咱們之前的認識,隨機端口61000-32768=28232,那么我實驗的機器是一臺剛安裝的系統(tǒng),沒有什么網絡傳輸,即便有,我們創(chuàng)建2萬個套接字對應該是沒問題吧。事實真的如此嗎?我們用實驗來證明:

我們模擬發(fā)送2萬個請求,2000的并發(fā)來測試百度:

[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)

這不可能,為什么報錯了?不要擔心,報錯我們很容易看懂了socket: Too many open files (24)

,不能打開太多的文件。我們使用ulimit來看看系統(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

(省略部分輸出)

沒錯,默認情況下,當前用戶能夠打開的文件數(shù)量大是1024,但是這個和我們使用ab測試有什么關系呢?ab測試創(chuàng)建的不是socket嗎?如果你不理解,那就要回歸本質,想想我們剛剛學習Linux的時候,經常聽到的一句Linux的思想“一切皆文件”!誰說socket不是一個文件呢?

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


創(chuàng)建一條TCP Socket

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

服務端:

首先,我們在192.168.56.12上使用nc命令,來監(jiān)聽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

客戶端:

在客戶端,同樣使用nc命令來連接到服務端的9999端口。

[root@192.168.56.11 ~]#nc 192.168.56.12 9999

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

查看Socket

我們先來看看客戶端的TCPSocket。

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

tcp    0     0 192.168.56.11:11525    192.168.56.12:9999     ESTABLISHED

服務端的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

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

    不過,如果你真的理解了Socket的概念,你已經有了一個終極解決方案。既然一個TCP Socket是一個四元組,那如果我這臺機器有多個IP地址呢?哈哈,這是一句畫龍點睛之語,你懂的!

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

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

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

趕緊看看服務端有沒有收到886。

以上就是Socket基礎知識有哪些,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注創(chuàng)新互聯(lián)-成都網站建設公司行業(yè)資訊頻道。

網頁題目:Socket基礎知識有哪些-創(chuàng)新互聯(lián)
分享網址:http://chinadenli.net/article36/dpispg.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供網站內鏈Google品牌網站制作營銷型網站建設App開發(fā)域名注冊

廣告

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

成都網頁設計公司