套接字(linux相关)

 

前言:略

一、前因

  一切从tcp、udp开始。

  众所周知,网络模型一般有两种模型,一种为OSI概念模型(七层),另一种为TCP/IP网络模型(四层)。

  TCP/IP应用层对应OSI的应用层、显示层、会话层;TCP、UDP对应传输层;互联网层对应网络层;设备驱动程序和硬件对应物理层。如下图所示:’

  

  在linux上,四层以下被称为通讯子网,四层以上被称为应用层。前者更注重通信细节,主要实现主机与主机之间如何完成数据报文传输;后者更注重应用层细节,主要实现资源交换

  linux启动后,应用层细节在用户空间实现,通信细节则在内核空间实现。

  所以,最原始最有需求的跨主机间的通信,皆由内核完成;相对而言真正的应用则是通信协议在用户空间特定的实现方式,比如dns完成域名解析,比如ssh实现安全登陆。自然,既是完成特定功能,便不应该位于内核空间。

  当然,也有所疑惑,主机间的通信不是通过IP地址间进行通信的吗? 没错。但是Ip协议本身并不可靠,且是无连接的。相对而言,tcp协议确是有链接,传输层在一定程度上弥补了网络层的缺陷,当然这仅是其中一部分缘由。 

 


 

二、正题

  回归正题,所谓传输层(tcp、udp)是提供进程地址空间,用端口号(port number)来标识进程地址空间。

  其中tcp是一种传输控制协议,即面向对象协议;通信前需建立虚拟链路,需事先知道对方是否在线,通信结束后还需断开链路(tcp的三次握手)。

  而udp(User Datagram Protocol)是无连接协议;通信前无需建立虚拟链路,无需确定对方是否在线。

  二者为完全不同的协议,且各有0-65535个端口【自然需要排除一些众所周知的端口,80/tcp(http),22/tcp(ssh)等端口】。

  前文所述,所有的应用层协议都位于应用层,倘若需要跨主机间进行通信,必须向内核申请,然而。。。然而,内核标记各主机之间通过网络进行通信时,却是通过套接字方式进行的。

  那么问题又来了,套接字又是什么?

  套接字(Socket):IPC的一种实现方式;主要目的是允许不同主机(也可以是同意主机)上不同进程之间进行通信从而完成数据交换。诚然,套接字既由内核实现也就属于内核,属于system call。事实上,Socket一般称之为Socket API,主要是它在system call中提供了太底层太基础,因此,在C标准库中才被称作Socket API。

  诚然,跨主机间的套接字为:Ip+端口【ip用来标记主机,端口用来标识进程空间】

  所以具体实现方式是:当用户发起跨主机间通信时,会基于套接字的方式调用套接字,从而内核空间申请tcp、udp端口,从而建立虚拟链路(如果是tcp的话)进行通信。

  

  题外话:除了tcp、udp之外还有另一种方式,使用裸套接字的方式,直接封装ip报文。

      Socket的三种类型:

       SOCK_STREAM:tcp套接字

       SOCK_DGRAM:udp套接字

       SOCK_RAM:裸套接字

  综上所述,无论什么网络服务,都必定需要使用网络通信的基本功能。即tcp、udp、或者其他。

 


 

三、深入

  向前一步!

  主机间通过套接字进行通信,套接字为ip+端口,那么问题又来了,如果服务器与客户端进行通信,所使用的套接字又该如何解决?

  端口号(port number)是用来标记进程空间地址(tcp和udp各一种),显然端口号是唯一且独占的。倘若服务器端和客户端皆使用同一端口【80/tcp(http)】,那事情就大条了,服务器端口被独占又如何能够回应多个客户端,显然这是不可能的。所以,只能在妥协中前行,客户端使用随机端口,而服务器端使用固定端口。

 这之中又牵扯出了两大疑问:

 (1)为何是客户端使用随机端口,而不是服务器端?

  服务器端就好比是学院,而客户端好比学院的家。学院的地址必定是固定的,否则又如何上学;相对的,学院的家并无需固定地址。当发起跨主机间通信时,会向内核申请一个随机端口1访问远端服务器

 (2)服务器端是如何回应多个客户端?

  如图:本地发送缓冲对应远端接受缓冲;本地接受缓冲对应远端发送缓冲。在信道通信上是采取不同通信信道(接收和发送不是一个信道),而其中还包含缓冲,抑制高发低收压垮通信信道显然,服务器端一旦接受连接后,响应客户端也是随机端口

  

        

  

 

 另外:事实上,所说套接字是ip+端口并不是完全准确,根据其所使用的地址可划分为多个

     AF_INET:IPv4

     AF_INET::IPv6

     AF_UNIX:同一主机不同进程中的通信时使用

 且每种类型至少都提供了两种套接字(Socket),一种是无连接,有边界的,不可靠传递的数据报(UDP);另一种是有连接,有边界,可靠传递的流(TCP)。顺便一提,AF_UNIX不同于另外两种,它无需经过数据链路层,仅仅在传输层(第三层)中便可完成通信。

 


随机端口:

 IANA将端口范围进行了明确划分:

  0-1023:永久划分给应用程序使用的端口,特权端口(同样也是管理员才能使用的端口范围),比如:22/tcp(ssh)、80/tcp(http)

  1024-41952:注册端口,但是并不严格,分配给某些注册的应用程序使用,比如:3306/tcp(mysql)

  41952+:客户端动态分配的端口,动态端口,或私有端口

 所以,服务器响应客户端的随机端口号事实上是41952号端口以上的动态端口。但是。。。但是,服务器在某些高并发的情况下动态端口的数量是不足的,需手动调整端口范围让其包含41952以下的端口,在linux上修改:/proc/sys/net/ipv4/ip_local_port_range

 不过,调整的端口范围不能包含1024以下的端口,毕竟0-1023只有管理员才能够使用。

   

            

转载于:https://www.cnblogs.com/Forestes/p/7784956.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368785.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Maven的春天

1.概述 本教程将讨论如何使用Maven设置Spring,并介绍使用Spring依赖项的特定用例。 最新的Spring版本可以在Maven Central上找到。 2.基本的Maven Spring依赖关系 Spring被设计为模块化和灵活的-基本的Spring容器可用于各种场景,而无需包含框架必须提供…

linux查看进程运行日志文件,【Linux】常用指令、ps查看进程、kill杀进程、启动停止tomcat命令、查看日志、查看端口、find查找文件...

1.说出 10 个 linux 常用的指令1) ls 查看目录中的文件2)cd /home 进入 / home 目录;cd .. 返回上一级目录;cd ../.. 返回上两级目录3)mkdir dir1 创建一个叫做 dir1 的目录4)rmdir dir1 删除一个叫做 dir1 的目录 (只能删除空目录)5)rm -f file1 删除一…

页面缓存之Meta http-equiv属性详解

http-equiv顾名思义,相当于http的文件头作用,它可以向浏览器传回一些有用的信息,以帮助正确和精确地显示网页内容,与之对应的属性值为content,content中的内容其实就是各个参数的变量值。 引用 meat标签的http-equiv…

Mysql存储过程详解

Mysql存储过程:1.1 定义:把复杂的操作,封装一个过程。类似于函数。 优点: 1、复杂操作,调用简单。 2、速度快。 缺点: 1、封装复杂。 2、没有灵活性。1.2 查看所有存储过…

E20171106-hm

pulldown adj. 折叠式的; pulldown menu 下拉菜单转载于:https://www.cnblogs.com/lancgg/p/8281683.html

Java PDF库

最近,我有一项任务是选择一些Java PDF库用于PDF生成。 但这不是一个简单的任务。 我想到的第一件事是iText。 众所周知Java库具有良好的声誉。 但是...有一些塞子。 iText 5版是在AGPL许可下发布的。 即,如果我们想在商业产品中使用iText,则必…

linux系统md5sum命令用不了,Linux中md5sum命令起什么作用呢?

摘要:下文讲述Linux中md5sum命令的功能说明,如下所示;md5sum命令功能:用于为一个文件生成其内容的MD5值,此命令的原理是对文件的内容进行校验,生成文件内容的MD5值此方式常用于检测文件是否被篡改(因为内容修改后,其MD5值会发生变…

前端工程师必备的几个实用网站

一、配色类网站 http://colorhunt.co 这个网站给我们提供了很多的配色方案,我们直接使用就OK了。使用方法也很简单,鼠标移动到对应的颜色上,我们就可以看到颜色的十六进制码,复制这个颜色到工具里就可以使用了。 https://webgra…

BZOJ1004 [HNOI2008]Cards 【burnside定理 + 01背包】

题目链接 BZOJ1004 题解 burnside定理 在\(m\)个置换下本质不同的染色方案数,等于每种置换下不变的方案数的平均数 记\(L\)为本质不同的染色方案数,\(m\)为置换数,\(f(i)\)为置换\(i\)下不变的方案数,那么\[L \frac{1}{m}\sum\li…

函数接口– Java 8中java.util.function包中的函数接口

我以前写过有关功能接口及其用法的文章。 如果您正在探索要成为Java 8一部分的API,尤其是那些支持lambda表达式的API,您会发现很少的接口,例如Function,Supplier,Consumer,Predicate和其他接口,…

Gcc静态编译出错

编译命令:gcc -static -o test test.c 出错信息:/usr/bin/ld: cannot find -lccollect2: error: ld returned 1 exit status 原因&解决方法:静态链接需要静态库,系统没有安装静态库导致报错。yum install glibc-static.x86_64…

css之浮动

首先说下什么是浮动(float):浮动的框可以向左向右移动,直到他的外边缘碰到包含框或者另一个浮动框为止。 浮动在css样式里面是很重要的,我们一起来看看浮动的特点: 1.脱离标准文档流(简称脱标&…

linux 修改jmeter内存溢出,jmeter本机内存溢出如何修改?

websocket连接过程中内存溢出,本机配置的内存最大和最小设置的512;一、后台返回二、结果树返回:Thread Name: 线程组 1-9Sample Start: 2017-09-11 13:59:49 CSTLoad time: 9006Connect Time: 0Latency: 0Size in bytes: 0Sent bytes:0Header…

Monkey写脚本

今天学习使用monkey测试一个应用的登陆,遇到些问题记录下: 先上代码: typeraw events count 1 speed 1.0 start data >>LauncheActivity(com.android.smartmirror,com.android.smartmirror.activities.MainActivity)UserWait(500) //…

JSF:在传统组件和时尚性能杀手之间进行选择

这篇博客文章起源于一个大型Web应用程序中的性能问题。 每个人都优化Java代码,但似乎没有人尝试优化JavaScript代码。 奇怪,因为在客户端有很多改进的空间。 我会说,甚至比服务器端还要多。 我们将分析可编辑的JSF标准组件(有时称…

JS之 if语句函数 对接事件动作 函数更改css css对接需要换妆的区id或class

if 函数的实现步骤: function 名字() 指定id , 指定开关(display: none or block) if else 构成逻辑 控制开关 决定在哪里安置一个灯泡, 指定一个id给某个标签 把开关用电线连着灯泡, 安装开关 # id名称{ 属性1 赋值, 属性 2 赋值 , 属性3 赋值 } 所有的赋值都可以成为一…

BZOJ - 4520 K远点对

题意:已知平面内 N 个点的坐标,求欧氏距离下的第 K 远点对 维护大小为2k最小堆,KD树的估值用前面提到的做法 PS.网上有人估价是使用边界四个点的最值来独立枚举,然而这样写似乎过不了 #include<bits/stdc.h> #define rep(i,j,k) for(register int ij;i<k;i) #define r…

小型Hadoop集群的Ganglia配置和一些故障排除

Ganglia是一个针对大型集群的开源&#xff0c;可扩展且分布式的监视系统。 它收集&#xff0c;汇总并提供数十种与计算机相关的指标&#xff08;例如CPU&#xff0c;内存&#xff0c;存储&#xff0c;网络使用情况&#xff09;的时序视图。 您可以在UC Berkeley Grid上看到Gang…

linux 命令分号,linux命令之间的分号,, ||

声明、定义 in C&plus;&plus;序 声明和定义是我们使用的基础,但是对于声明和定义的概念,我们不甚了了,也就是说感觉好像是这样,但是真要详细说明就说不上来. 有博主对于声明和定义有以下描述: 1.需要建立存储空间的 ...Java基础之创建窗口——使用流布局管理器…

margin赋值为负值的几种效果(负值像素,负值百分数)

1、margin-top为负值像素 margin-top为负值像素&#xff0c;偏移值相对于自身&#xff0c;其后元素受影响&#xff0c;见如下代码&#xff1a; 1 <!DOCTYPE html>2 <html lang"zh">3 <head>4 <meta charset"UTF-8" />5 &…