socket网络编程(二)(tcp udp)

2023-10-27

1、socket大概介绍

Socket的中文翻译过来就是“套接字”。套接字是什么,我们先来看看它的英文含义:插座。

Socket就像一个电话插座,负责连通两端的电话,进行点对点通信,让电话可以进行通信,端口就像插座上的孔,端口不能同时被其他进程占用。而我们建立连接就像把插头插在这个插座上,创建一个Socket实例开始监听后,这个电话插座就时刻监听着消息的传入,谁拨通我这个 “IP地址和端口”,我就接通谁。

实际上,Socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口,供应用层调用实现进程在网络中的通信。Socket起源于UNIX,在Unix一切皆文件的思想下,进程间通信就被冠名为文件描述符(file desciptor),Socket是一种“打开—读/写—关闭”模式的实现,服务器和客户端各自维护一个“文件”,在建立连接打开后,可以向文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。

2、TCP/IP协议

要理解socket必须的得理解tcp/ip,socket 通信是基于TCP/IP 网络层上的一种传送方式,我们通常把TCP和UDP称为传输层。

TCP/IP协议不同于iso的7个分层,它是根据这7个分层,将其重新划分:
在这里插入图片描述

TCP/IP协议参考模型把所有的TCP/IP系列协议归类到四个抽象层中

应用层:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等

传输层:TCP,UDP

网络层:IP,ICMP,OSPF,EIGRP,IGMP

数据链路层:SLIP,CSLIP,PPP,MTU

每一抽象层建立在低一层提供的服务上,并且为高一层提供服务,看起来大概是这样子的:
在这里插入图片描述
通过上面的图形,由于底一层的需要向高一层的提供服务。

3、再次理解socket

到目前为止,大致的了解了应用程序和tcpip协议的大致关系,我们只是知道socket编程是在tcp/IP上的网络编程,但是socket在上述的模型的什么位置呢:
在这里插入图片描述
我们可以发现socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口,供应用层调用以实现进程在网络中通信。

4、Socket通信过程(tcp)

Socket保证了不同计算机之间的通信,也就是网络通信。对于网站,通信模型是服务器与客户端之间的通信。两端都建立了一个Socket对象,然后通过Socket对象对数据进行传输。通常服务器处于一个无限循环,等待客户端的连接。

一图胜千言,下面是面向连接的TCP时序图:
在这里插入图片描述
客户端过程:

客户端的过程比较简单,创建Socket,连接服务器,将Socket与远程主机连接(注意:只有TCP才有“连接”的概念,一些Socket比如UDP、ICMP和ARP没有“连接”的概念),发送数据,读取响应数据,直到数据交换完毕,关闭连接,结束TCP对话。

服务端过程:

咱再来聊聊服务端的过程,服务端先初始化Socket,建立流式套接字,与本机地址及端口进行绑定,然后通知TCP,准备好接收连接,调用accept()阻塞,等待来自客户端的连接。如果这时客户端与服务器建立了连接,客户端发送数据请求,服务器接收请求并处理请求,然后把响应数据发送给客户端,客户端读取数据,直到数据交换完毕。最后关闭连接,交互结束。

TCP三次握手的Socket过程:
在这里插入图片描述

  • 服务器调用socket()、bind()、listen()完成初始化后,调用accept()阻塞等待;
  • 客户端Socket对象调用connect()向服务器发送了一个SYN并阻塞;
  • 服务器完成了第一次握手,即发送SYN和ACK应答;
  • 客户端收到服务端发送的应答之后,从connect()返回,再发送一个ACK给服务器;
  • 服务器Socket对象接收客户端第三次握手ACK确认,此时服务端从accept()返回,建立连接。

接下来就是两个端的连接对象互相收发数据。

TCP四次挥手的Socket过程:
在这里插入图片描述

  • 某个应用进程调用close()主动关闭,发送一个FIN;
  • 另一端接收到FIN后被动执行关闭,并发送ACK确认;
  • 之后被动执行关闭的应用进程调用close()关闭Socket,并也发送一个FIN;
  • 接收到这个FIN的一端向另一端ACK确认。

上面的代码是简单的演示Socket的基本函数使用,其实不管有多复杂的网络程序,这些基本函数都会用到。上面的服务端代码只有处理完一个客户端请求才会去处理下一个客户端的请求,这样的服务器处理能力很弱,而实际中服务器都需要有并发处理能力,为了达到并发处理,服务器就需要fork一个新的进程或者线程去处理请求。

5、一些重要概念的理解

1、HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。

2、TCP和UDP的区别
a: TCP是面向链接的,虽然说网络的不安全不稳定特性决定了多少次握手都不能保证连接的可靠性,但TCP的三次握手在最低限度上(实际上也很大程度上保证了)保证了连接的可靠性;

而UDP不是面向连接的,UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收,当然也不用重发,所以说UDP是无连接的、不可靠的一种数据传输协议。

b: 也正由于a所说的特点,使得UDP的开销更小数据传输速率更高,因为不必进行收发数据的确认,所以UDP的实时性更好。

3、socket心跳包机制实践与理解
实现Socket心跳包主要分为两大类,第一采用tcp自带的KeepAlive,第二是自定义心跳包。
首先第一种KeepAlive机制,这种机制的原理是在客户机与服务器之间维持一个低级别的探查,当检查到一定时间双方没有发生通信时,则会启动通信心跳,连续通信三次,每次间隔一个时间,根据这次探查结果来确认当前socket是否可用。 这种机制的好处就在于具体的通信内容不需要程序员操心发送与接受,它自动实现了这套功能。

4、socket通信有两个概念,一定要区分清
首先上面讲的client和server之间的socket通信指的是两台设备之间的通信,有三次握手这些概念;
而还有一种socket通信指的是应用层app访问网络设备底层驱动之间的通信,如下:

int
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

socket网络编程(二)(tcp udp) 的相关文章

  • 完整的 C++ i18n gettext()“hello world”示例

    我正在寻找完整的 i18ngettext 你好世界的例子 我已经开始了一个基于的脚本使用 GNU gettext 的本机语言支持教程 https web archive org web 20130330233819 http oriya s
  • 如何使用 go1.6.2 构建 linux 32 位

    有没有任何组合GOARCH and GOOS我可以设置哪些值来构建 ELF 32 位二进制文 件 GOOS linux and GOARCH 386 更多示例 架构 32 bit gt GOARCH 386 64 bit gt GOARCH
  • 套接字发送调用被阻塞很长时间

    我每 10 秒在套接字上发送 2 个字节的应用程序数据 阻塞 但发送调用在下面的最后一个实例中被阻塞超过 40 秒 2012 06 13 12 02 46 653417 信息 发送前 2012 06 13 12 02 46 653457 信
  • php_network_getaddresses: getaddrinfo 失败: 名称或服务未知 (0) 连接失败..!

    我正在使用 php 邮件程序功能 但出现以下错误 如何修复它 2016 01 22 06 15 48 SMTP 错误 无法连接到服务器 php network getaddresses getaddrinfo失败 名称或服务未知 0 连接失
  • 亚马逊 Linux - 安装 openjdk-debuginfo?

    我试图使用jstack在 ec2 实例上amazon linux 所以我安装了openjdk devel包裹 sudo yum install java 1 7 0 openjdk devel x86 64 但是 jstack 引发了异常j
  • 如何使用 VSCode 调试 Linux 核心转储?

    我故意从我使用 VSCode 编写的 C 应用程序生成核心转储 我不知道如何调试核心转储 有没有人愿意分享这方面的经验 更新 我相信我现在已经可以使用了 我为核心文件创建了第二个调试配置 我需要添加指向生成的转储文件的 coreDumpPa
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • Java时区混乱

    我正在运行 Tomcat 应用程序 并且需要显示一些时间值 不幸的是 时间快到了 还有一个小时的休息时间 我调查了一下 发现我的默认时区被设置为 sun util calendar ZoneInfo id GMT 08 00 offset
  • 为什么无论 -rdynamic 如何,backtrace 都不包含 Objective-C 符号?

    Update 我正在 Linux 上使用 GNU 运行时 问题是not发生在带有 Apple 运行时的 MacOS 上 更新2 我在 MacOS 上编译了 GNU 运行时并用它构建了示例 该错误确实not发生在带有 GNU 运行时的 Mac
  • 为什么使用signalfd无法捕获SIGSEGV?

    我的系统是ubuntu 12 04 我将示例修改为man 2 signalfd 并添加sigaddset mask SIGSEGV 在示例中 但我无法得到输出SIGSEGV被生成 这是一个错误吗glibc 源代码片段如下 sigemptys
  • 命名互斥体的 Mono 替代方案

    在 Windows NET 上 命名的互斥体可用于同步多个进程 不幸的是 Mono 在 Linux 上不太支持这一点 他们的发行说明 http www mono project com Release Notes Mono 2 8 Shar
  • 如何在 Linux 中向热敏打印机发送 ESC/POS 命令

    我正在尝试在热敏打印机上发送 ESC POS 命令 但每当我发送它们时 热敏打印机都会将它们打印为文本 而不是作为命令执行它们 我在 prn 文件中编写这些命令 每当我执行 lp 命令来打印文件时 这些 prn 文件也会被打印 但作为文本
  • C++ Linux GCC 应用程序中的 GUID

    我有很多服务器运行这个 Linux 应用程序 我希望他们能够生成一个碰撞概率较低的 GUID 我确信我可以从 dev urandom 中提取 128 个字节 这可能没问题 但是有没有一种简单易用的方法来生成与 Win32 更等效的 GUID
  • 如何将命令输出作为多个参数传递给另一个命令

    我想将命令的每个输出作为多个参数传递给第二个命令 例如 grep pattern input returns file1 file2 file3 我想复制这些输出 例如 cp file1 file1 bac cp file2 file2 b
  • BeagleBone Black 如何用作大容量存储设备?

    是否可以使用 BB 作为大容量存储设备 我希望将其连接到可以从 USB 连接 例如 USB 闪存驱动器 读取文件的音频播放器并充当包含一个特定文件夹的数据存储设备 及其子文件夹 从文件系统 如果可能 在连接到开发板的闪存驱动器上 正如设备规
  • 在 MacOS 上构建需要 net461 的 dotnet SDK 项目的最简单方法

    我有一个 dotnet SDK sln and a build proj with
  • 在 Linux 服务器上创建和编辑 MS-Word 文档?

    希望开发处理文档的服务器端应用程序 源文档大多是MS Word 2003 2007 即MS版本的Docx 希望服务器应用程序能够在linux或windows上运行 想知道在linux下读写MS Word文件最好的工具或库是什么 兼容性是最重
  • 为什么我的代码在编译用于分析 (-pg) 时在多线程下运行比在单线程下运行慢?

    我正在写一个光线追踪器 最近 我在程序中添加了线程 以利用 i5 四核上的附加内核 奇怪的是 应用程序的调试版本现在运行速度变慢 但优化后的构建运行速度比添加线程之前更快 我将 g pg 标志传递给 gcc 以进行调试构建 并将 O3 标志
  • “./somescript.sh”和“. ./somescript.sh”有什么区别

    今天我按照一些说明在 Linux 中安装软件 有一个需要首先运行的脚本 它设置一些环境变量 指令告诉我执行 setup sh 但是我执行时犯了一个错误 setup sh 所以环境没有设置 最后我注意到了这一点并继续进行 我想知道这两种调用脚
  • ARM 的内核 Oops 页面错误错误代码

    Oops 之后的错误代码给出了有关 ARM EX 中的恐慌的信息 Oops 17 1 PREEMPT SMP在这种情况下 17 给出了信息 在 x86 中它代表 bit 0 0 no page found 1 protection faul

随机推荐

  • HTML转义字符大全

    1 常用转义字符 转义字符串 Escape Sequence 也称字符实体 Character Entity 在HTML中 定义转义字符串的原因有两个 第一个原因是像 lt 和 gt 这类符号已经用来表示HTML标签 因此就不能直接当作文本
  • 学习 bison 原理(四)

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 学习 bison 原理 四 第5步 转变第 4 步的状态机为确定的 LALR 状态机 在 三 中我们已经看到 LR0 状态机很可能有 r r 冲突 s r 冲突 那这关键的
  • QList与QVector

    看qt的文档 只要是不要求数据所存放的内存是连续的 都建议用QList 因为QList的查询速度跟QVecotr是差不多的 感觉有点奇怪 至少与我之前所认识的List的查询是一不样的 好吧 看看源码的 原来QList的元素的指针是通过数组来
  • 文本处理——基于 word2vec 和 CNN 的文本分类 :综述 & 实践(一)

    原文地址 https zhuanlan zhihu com p 29076736 导语 传统的向量空间模型 VSM 假设特征项之间相互独立 这与实际情况是不相符的 为了解决这个问题 可以采用文本的分布式表示方式 例如 word embedd
  • ohmyzsh主题修改

    1 选择主题 ohmyzsh Themes by Github 2 修改zsh配置 vim zshrc 3 使配置生效 source zshrc 效果如下
  • 二、初识arduino uno开发板

    开发板参数表 什么是arduino Arduino是一款便捷灵活 方便上手的开源电子原型平台 包含硬件 各种型号的Arduino板 和软件 ArduinoIDE 构建于开放原始码simple I O介面版 并且具有使用类似Java C语言的
  • Golang闭包陷阱

    golang闭包陷阱本质原理其实是range陷阱 Golang for range陷阱 ep 1 func main var values int 1 2 3 4 5 for value range values go func fmt P
  • 编译 OneFlow 模型

    本篇文章译自英文文档 Compile OneFlow Models tvm 0 14 dev0 documentation 作者是 BBuf Xiaoyu Zhang GitHub 更多 TVM 中文文档可访问 Apache TVM 是一个
  • 3月6日服务器例行维护公告,2014年3月6日停机维护公告

    亲爱的玩家 为了保证服务器的稳定和服务质量 新大话西游2 将于2014年3月6日早上8 00停机 进行每周例行的维护工作 维护时间为早上08 00至09 30 同时 本次停机还将发布最新的客户端补丁 patch2 0 476 如果在维护期间
  • Java高级编程——多线程(JDK5新增创建线程方式Callable,线程池)

    创建线程的第三 四种方式 一 实现Callable接口 1 1与Runnable相比 1 2实现步骤 创建Callable接口实现类 重写call方法 新建实现类对象 将实现类对象作为参数传递待FutureTask的构造器中 创建Futur
  • 使用redis进行用户接口访问时间次数限制

    使用redis进行用户接口访问时间次数限制 假设一个用户 用IP判断 每分钟访问某一个服务接口的次数不能超过10次 import org apache commons lang3 StringUtils import org slf4j L
  • Android Studio一直Waiting for build to finish

    今天安卓的gradle文件出现问题 所以将C Users Administrator gradle删除 接下来出现下图的问题 这是由于安卓缺少gradle文件 图片来自https blog csdn net Hanghang article
  • 手撕yolo3系列——详解主干网络darknet53代码(详细注释)

    完整代码百度云直达链接 包含预训练权重 小白注释 https pan baidu com s 1US6e93OaCYOghmF21v0UIA 提取码 z8at 参考链接 注 代码是大神的代码 在此基础上添加了详细的小白注释 方便我以后阅读
  • Keil调试即全速运行/断点不停的其中一个原因

    平台 芯片 STM32F767IGT6 环境 Keil 5 14 00 问题 keil 下载程序可以执行 调试时刚进调试就上电运行 打断点不停 但是程序正常在跑 可以单步调试 原因 Jlink硬件版本和驱动的问题 解决 之前电脑使用stm3
  • image.shape[0],image.shape[1],image.shape[2]

    import cv2 image cv2 imread D shape bmp print image shape 0 print image shape 1 print image shape 2 结果 300 200 3 其中shape
  • mysql8.0安装之后,无法使用密码正常登陆

    修改方法 重置密码 以下为步骤 1 以管理员身份先关闭mysql服务器 net stop mysql 删除mysql目录下data文件夹 如果有就删除 2 在mysql目录下输入 mysqld initialize user mysql c
  • python如何判断是否为整数

    python 判断是否为整数的方法 1 使用 type 函数判断 代码为 type name bases dict 2 使用 isinstance 函数判断 代码为 isinstance object classinfo 本教程操作环境 w
  • java 生成随机字母数字组合

    import java util Random public class RandomTest 方法1 生成随机数字和字母组合 param length return public static String getCharAndNumr
  • 让UE4中的TextRender永远面向摄像机,就像Billboard那样!

    让UE4中的TextRender永远面向摄像机 就像Billboard那样 让UE4中的TextRender永远面向摄像机就像Billboard那样 前言 Find Look At 函数 BillBoard 材质编程 前言 最近找了个兼职
  • socket网络编程(二)(tcp udp)

    1 socket大概介绍 Socket的中文翻译过来就是 套接字 套接字是什么 我们先来看看它的英文含义 插座 Socket就像一个电话插座 负责连通两端的电话 进行点对点通信 让电话可以进行通信 端口就像插座上的孔 端口不能同时被其他进程