网易首页 > 网易号 > 正文 申请入驻

网络协议之:socket协议详解之Socket和Stream Socket

0
分享至

简介

不管是在普通的网络编程中还是在netty中,都经常会提到一个词叫做socket,好像socket是一个神奇的东西,使用socket我们可以建立客户端到服务器端的连接,并且和进行客户端和服务器端的通讯,那么socket到底是什么呢?它有哪些分类呢?一起来看看吧。

Socket是什么

socket的中文翻译是套接字,个人觉的这个翻译真的是太差劲了,套接字听起来毫无意义,所以很多人在第一次听到socket这个词的时候肯定很迷茫。

那么什么是socket呢?socket是一种不同程序间进行进程通讯的方法,这些程序可以在同一个服务器上也可以在不同的服务器上。

socket建立连接的基础是IP协议,IP协议被用来进行数据的封装和分组,然后才能够在网络上进行传输。这种依赖于IP协议的socket,又叫做network socket。

通过network socket可以建立客户端和服务器端的连接,客户端和服务器端是通过socket address来发现对方的。

以java为例,我们来看下SocketAddress的定义:

public abstract class SocketAddress implements java.io.Serializable {

static final long serialVersionUID = 5215720748342549866L;

}

可以看到SocketAddress只是一个笼统的定义,它可以有多种实现,它具体的实现中包含了传输协议,比如说是TCP,还是UDP,另外还需要包含一个IP地址和一个连接的端口。

其中IP地址和端口定义了连接的对象,协议定义的是连接方式。

基于不同的协议,可以衍生出不同的类型的sockets。比如依赖于TCP协议的叫做Stream sockets,依赖于UDP协议的叫做Datagram sockets,依赖于local files来进行数据传输的叫做Unix Domain Sockets.

接下来我们会在一个unix系统中详细讲解这几种协议的使用。

在讲解详细的例子之前,我们需要使用到关于网络的命令,他们是ss,nc和socat。

在本文中,我使用的是centOS系统,所以你可以使用下面的命令进行安装:

yum install iproute2 netcat-openbsd socat
Stream Socket

什么是Stream Socket呢?从字面上可以看出,这个Socket连接是用来进行流传输的,如果要进行流的传输,那么首先就需要建立一个稳定的网络连接,在稳定的连接方面,毫无疑问TCP(Transmission Control Protocol)是最常用也是极其高效的一种协议。

对于Stream Socket来说,它是有向性的,数据package需要从一个地址通过网络传递到另外一个地址,同时还需要接受到对方的处理返回结果,在这个过程中通常使用的就是TCP协议。

TCP协议能够保证数据的稳定性和有序性,TCP的数据包可以保证发送到物理网络接口的数据包顺序。如果网络接口接收到的数据包是无序的,那么网络适配器和操作系统将确保它们以正确的顺序重新组合以供应用程序使用。

常见的基于TCP的Stream Socket就是我们常常访问的http和https服务了,处理http和https服务的服务器一般是nginx或者apache,那么通常会有下面的Stream Socket地址:

124.225.141.53:80
124.225.141.53:443

上面我用的是网易的ip地址,其中80表示的是http,443表示的是https。

使用socat创建一个TCP服务器

常用的TCP服务器可以选择apache或者nginx,这里为了简单起见,我们选择使用socat来创建一个TCP服务器。

socat是什么呢?它是SOcket CAT的简称,可以用来模拟一个TCP的服务器。

socat的命令很复杂,这里我们只是简单介绍一下它的应用:

socat -h
socat by Gerhard Rieger and contributors - see www.dest-unreach.org
Usage:
socat [options]

从上面的结果我们可以看出,socat可以接受一些地址,然后可以添加一些选项。

这里我们使用socat来创建两个连接,分别是TCP6和TCP4,socat有两个选项可以做这项工作:

tcp-connect:: groups=FD,SOCKET,CHILD,RETRY,IP4,IP6,TCP
tcp-listen: groups=FD,SOCKET,LISTEN,CHILD,RETRY,RANGE,IP4,IP6,TCP
tcp4-connect:: groups=FD,SOCKET,CHILD,RETRY,IP4,TCP
tcp4-listen: groups=FD,SOCKET,LISTEN,CHILD,RETRY,RANGE,IP4,TCP
tcp6-connect:: groups=FD,SOCKET,CHILD,RETRY,IP6,TCP
tcp6-listen: groups=FD,SOCKET,LISTEN,CHILD,RETRY,RANGE,IP6,TCP

这里我们只需要建立两个监听TCP的服务,所以我们使用下面的命令:

socat TCP4-LISTEN:8888,fork /dev/null&
socat TCP6-LISTEN:8888,ipv6only=1,fork /dev/null&

上面的命令,我们在8888端口上监听TCP4和TCP6的连接信息,其中fork参数表示程序在接收到程序包之后继续运行,如果不用fork,那么程序会自动退出。

socat后面本来要接一个bi-address,这里我们使用/dev/null,表示丢弃掉所有的income信息。

TCP6-LISTEN有个特殊的参数叫做ipv6only,表示收到的数据包不要发送到IPv4-mapped IPv6 addresses。

什么是IPv4-mapped IPv6 addresses?简单点说就是将IPv4映射到了IPv6的地址中。

执行上述命令,我们会得到下面的输出:

[1] 30877
[2] 30885

因为是后台执行,所以我们返回了进程的ID。

使用ss检查TCP连接

ss是一个非常强大的命令,我们可以通过使用ss来监测TCP sockets的信息,它的使用情况如下:

ss -h
Usage: ss [ OPTIONS ]
ss [ OPTIONS ] [ FILTER ]

我们主要看下面几个将要用到的参数:

-4, --ipv4 display only IP version 4 sockets
-6, --ipv6 display only IP version 6 sockets
-t, --tcp display only TCP sockets
-l, --listening display listening sockets
-n, --numeric don't resolve service names

因为我们只监听ipv4和ipv6的数据,所以这里我们用-4和-6这两个参数。

另外因为只需要监听tcp sockets,所以需要使用-t参数。

因为是监听,所以使用-l参数,最后我们希望看到具体的数字,而不是被解析成了服务名,所以这里使用-n参数。

我们使用下面的命令看看结果:

ss -4 -tln

结果如下:

State Recv-Q Send-Q Local Address:Port Peer Address:Port

LISTEN 0 5 *:8888 *:*

表示监听到了端口8888, 当然如果你的服务器上有其他的进程,那么可能不止这一条数据。

上面的命令只监听了Ipv4,我们再看看Ipv6:

ss -6 -tln

可能得到下面的输出:

ss -6 -tln
State Recv-Q Send-Q Local Address:Port Peer Address:Port

LISTEN 0 5 :::8888 :::*

和Ipv4的很类似,表示我们在Ipv6上监听到了端口8888。

使用nc连接socket

我们已经建立好了了监听TCP连接的服务器,接下来我们尝试使用nc命令来进行连接。

nc是Ncat的简称,它是一个非常有用的网络工具,可以做很多事情。我们来看下本例子中会用到的参数:

-4 Use IPv4 only
-6 Use IPv6 only
-v, --verbose Set verbosity level (can be used several times)
-z Zero-I/O mode, report connection status only

因为需要连接到Ipv4和Ipv6,所以需要-4和-6参数。

另外我们需要输出详细的信息,所以需要-v参数,最后我们直接建立连接,并不发送任何数据,所以这里使用-z参数,我们执行一下来看看效果:

nc -4 -vz 127.0.0.1 8888

看看下面的输出结果:

nc -4 -vz 127.0.0.1 8888
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 127.0.0.1:8888.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.

可以看到nc已经成功建立了连接,并且发送了0 bytes的内容。

同样的,我们建立到Ipv6的连接:

nc -6 -vz ::1 8888

这里的 ::1表示的是Ipv6的本地地址。输出结果如下:

Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to ::1:8888.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.
总结

到此,我们介绍了Socket的基本分类Stream Socket的含义,并且使用unix中的工具搭建了socket服务器和客户端,当然这只是最简单的说明描述,大家用来体会Stream Socket的流程即可。

本文已收录于 http://www.flydean.com/15-stream-socket/

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
真相大白!胡塞宣称的袭击“艾森豪威尔”号,竟然是一个国际玩笑

真相大白!胡塞宣称的袭击“艾森豪威尔”号,竟然是一个国际玩笑

吃鱼思故渊
2024-06-05 21:27:23
实探搬迁风暴中的周大福深圳工厂:裁员早有征兆,原本五六百人的工厂现在剩下几十个人

实探搬迁风暴中的周大福深圳工厂:裁员早有征兆,原本五六百人的工厂现在剩下几十个人

华夏时报
2024-06-07 11:01:11
兵不厌哈尔科夫之诈

兵不厌哈尔科夫之诈

报人刘亚东
2024-06-07 16:28:49
为保障考生出行 北京地铁做好加开列车准备

为保障考生出行 北京地铁做好加开列车准备

新京报
2024-06-07 08:05:06
一干部被查,涉嫌严重违纪违法

一干部被查,涉嫌严重违纪违法

锡望
2024-06-07 22:17:32
皇马杀疯了:维尼身价达1.8亿欧,坐拥3位世界第1,7人身价过亿!

皇马杀疯了:维尼身价达1.8亿欧,坐拥3位世界第1,7人身价过亿!

风过乡
2024-06-07 19:45:36
重磅!沪深北三大交易所,全发布了!

重磅!沪深北三大交易所,全发布了!

中国基金报
2024-06-07 21:13:15
北京一军官娶海军美女少校为妻,2年后才发现妻子的真实身份

北京一军官娶海军美女少校为妻,2年后才发现妻子的真实身份

星辰故事屋
2024-06-05 12:16:48
乌军在哈尔科夫传来捷报,此地彻底收复!

乌军在哈尔科夫传来捷报,此地彻底收复!

听风听你
2024-06-05 11:00:50
温州六中46名学生出游溺亡,头七集体回教室上课,到底是咋回事?

温州六中46名学生出游溺亡,头七集体回教室上课,到底是咋回事?

阿胡
2024-06-06 12:38:23
某一汽奥迪女主播疑似“裸体”直播?七折销售,已成当前常态…

某一汽奥迪女主播疑似“裸体”直播?七折销售,已成当前常态…

火山诗话
2024-06-07 06:35:31
“俄罗斯也可以军援美国敌人,就像美国援乌那样”

“俄罗斯也可以军援美国敌人,就像美国援乌那样”

鲁中晨报
2024-06-07 14:07:04
国家发改委:不得以机械加工、铸造、铁合金等名义新增钢铁产能 严格限制高耗能低附加值钢材、生铁、焦炭等产品出口

国家发改委:不得以机械加工、铸造、铁合金等名义新增钢铁产能 严格限制高耗能低附加值钢材、生铁、焦炭等产品出口

财联社
2024-06-07 16:18:08
痛心!两幼儿相继在自家游泳池溺亡,一家九口人竟无一人发觉!

痛心!两幼儿相继在自家游泳池溺亡,一家九口人竟无一人发觉!

文雅笔墨
2024-06-07 23:09:39
红颜薄命!凯特面部创伤严重,几乎九死一生,肿瘤科护士作证

红颜薄命!凯特面部创伤严重,几乎九死一生,肿瘤科护士作证

棒棒糖画画
2024-06-07 00:41:36
凤姐美国公开发飙:请中国人别再打扰我,我15年了还没有结婚!

凤姐美国公开发飙:请中国人别再打扰我,我15年了还没有结婚!

木子爱娱乐大号
2024-06-06 17:07:35
中国互联网产业已被美国甩开!华为一年营收≈谷歌一季营收,卷价格不卷研发是种病态

中国互联网产业已被美国甩开!华为一年营收≈谷歌一季营收,卷价格不卷研发是种病态

老郭在学习
2024-06-07 23:42:40
官宣!亚足联已取消拜合拉木在中泰之战的绝平球,让球迷直言意外

官宣!亚足联已取消拜合拉木在中泰之战的绝平球,让球迷直言意外

罗掌柜体育
2024-06-07 15:13:11
吃了无数亏,才换来的3个血泪教训!

吃了无数亏,才换来的3个血泪教训!

李舟
2024-06-06 18:26:22
当着全国人民的面“弄虚作假”20年!央视门面李梓萌怎么做到的?

当着全国人民的面“弄虚作假”20年!央视门面李梓萌怎么做到的?

综艺停车场
2024-06-06 19:34:44
2024-06-08 03:18:44
flydean程序那些事
flydean程序那些事
最通俗的解读,最深刻的干货!
356文章数 438关注度
往期回顾 全部

科技要闻

6家大模型抢答高考作文,谁是你心中的Top1

头条要闻

拜登称"一带一路"倡议已成为令人讨厌的计划 中方回应

头条要闻

拜登称"一带一路"倡议已成为令人讨厌的计划 中方回应

体育要闻

优势在我?中国足球有自己的节奏

娱乐要闻

汤唯抵达巴黎将担任奥运火炬手

财经要闻

身陷退市股的投资者:我的钱瞬间没了

汽车要闻

2.0T混动售20.98万元起 福特蒙迪欧运动版上市

态度原创

亲子
时尚
游戏
公开课
军事航空

亲子要闻

新生儿,大学生,中国的大航海时代。

接下来几个月,比看赛事更有意思的是......

舅舅党表示《无主之地4》不一定会公布:《文明7》来了

公开课

近视只是视力差?小心并发症

军事要闻

普京刚说完考虑"不对称"回应西方 俄核潜艇就将抵古巴

无障碍浏览 进入关怀版