网络编程概述

2023-05-16

今天开始正式学习网络编程这一块,特做此笔记记录学习过程。

要编写通过计算机网络通信的程序,首先要确定这些程序相互通信所用的protocol。在深入设计一个协议的细节之前,应该从高层次决断通信由哪个程序发起以及响应在何时产生,如一般认为web父娶妻程序是一个长时间运行的程序(即所谓的守护进程daemon),它只在响应来自网络的请求才发送网络消息。协议的一段是web客户程序,如浏览器,与服务器进程的通信总是由客户进程发起。大多数网络应用就是按照客户(client)和服务器(server)来组织的。在设计网络应用时,确定总是由客户发起请求往往能够简化协议和程序本身。当然也一些较为复杂的网络应用还需要异步回调(asynchronous callback)通信,也就是由服务器向客户发起请求消息。不过多为采用客户/服务器模型如下图:
这里写图片描述
通常客户每次只与一个服务器通信,不过以使用web浏览器为例,我们也许在10分钟内与许多不同的web服务器通信。从服务器角度来看,一个服务器同时与多个客户通信并不稀罕,如下图:
这里写图片描述
对于TCP/IP协议族而言,web客户和服务器之间使用TCP(Transmission Control Protocol,传输控制协议)通信。TCP又转而使用IP(Internet Protocol,网际协议)通信,IP再通过某种形式的数据链路层通信,如果客户和服务器处于同一以太网,就又如下图所示通信层次。这里写图片描述
尽管客户与服务器之间使用某个应用协议通信,传输层却使用TCP通信,注意,客户与服务器之间的信息流在其中一端是向下通过协议栈的,跨越网络后,在另一端则是向上通过协议栈的。另外注意,客户与服务器通常是用户进程,而TCP和IP协议通常是内核中协议栈的一部分。另外,此图也是OSI模型的一个示例。
OSI模型
描述一个网络中各个协议层的常用方法是使用国际标准化组织(International Organization for Standardization, ISO)的计算机通信开放系统互连(Open systems interconnection, OSI)模型,其有七层。如下图:
这里写图片描述
OSI 模型的顶上三层被合并成一层,称为应用层。这就是Web客户(浏览器),Telnet客户、Web服务器、FTP服务器和其他我们在使用的网络应用所在的层。
套接字提供的是从OSI模型的顶上三层进入传输层的接口:1、顶上三层处理具体的网络应用的所有细节,却对通信细节了解很少;底下四层对具体网络应用了解不多,却处理所有的通信细节:发送数据、等待确认,给无序到达的数据排序、计算并验证校验和等等。2、顶上三层通常构成所谓的用户进程(user process),底下四层却通常作为操作系统内核的一部分提供。Unix与其他现代操作系统都提供分割用户进程和内核的机制。
术语
计算机网络各层对等实体(同一层)间交换的单位信息称为协议数据单元(protocol data unit,PDU),分节(segment)就是对应于TCP传输层的PDU。按照协议与服务之间的关系,除了最低层(物理层)外,每层的PDU通过由紧邻下层提供给本层的服务接口,作为下层的服务数据单元(service data unit,SDU)传递给下层,并由下层间接完成本层的PDU交换。如果本层的PDU大小超过紧邻下层的最大SDU限制,那么本层还要事先把PDU划分成若干合适的片段让下层分开截送,再在相反方向把这些片段重组成PDU。同一层内SDU作为PDU的净荷(payload)字段出现,因此可以说上层PDU由本层PDU(通过其SDU字段)承载。每层的PDU除用于承载紧邻上层的PDU外,也用于承载本层协议内部通信所需的控制信息。
应用层实体(如客户或服务器进程)间交换的PDU称为应用数据(application data),其中在TCP引用进程之间交换的是没有长度限制的单个双向字节流,在UDP应用进程之间交换的是其长度不超过UDP发送缓冲区大小的单个记录(record),在SCTP应用进程之间交换的是没有总长度限制的单个或多个双向记录流。传输层实体(例如对应某个端口的传输层协议代码的一次运行)间交换的PDU称为消息(message),其中TCP的PDU称为分节(segement)。消息或分节的长度是有限的。在TCP传输层中,发送端TCP把来自引用进程的字节流数据(即由应用进程通过一次次输出操作写入到发送端TCP套接字中的数据)按顺序经分割后封装在各个分节中传送给接收端TCP,其中每个分节所封装的数据既可能是发送端应用进程单词输入操作的结果,也可能是连续数次输出操作的结果,而且每个分节所封装的单次输出操作的结果或首尾两次输出操作的结果即可能是完整的,也可能是不完整的,具体取决于可在连续建立阶段由对段通信的最大分节大小(maximum segment size,MSS)以及外出接口的最大传输单元(maximum transmission unit,MTU)或外出路径的路径MTU(如果网络层具有路径MTU发现功能,如IPv6)。分节除了用于承载应用数据外,也用于建立连接(SYN分节)、终止连接(FIN分节)、中止连接(RST分节)、确认数据接收(ACK分节)、刷送带发数据(PSH分节)和携带紧急数据指针(URG分节),而且这些功能(包括承载数据)可以灵活组合。UDP传输层相当简单,发送端UDP把来自应用层进程的单铬记录整个封装在UDP小心中传送给对段UDP。SCTP引入了称为块(chunk)的数据单元,SCTP消息就由一个公共首部加上一个或多个块组成:公共部分类似UDP消息的首部,仅仅给出源目的端口和整个SCTP消息的校验和;块则即可以承载数据(DATA块),也可以承载控制信息(由SACK块、INIT块、COOKIE ECHO块等,总称控制块)。发送段SCTP把来自应用进程的(一个或多个)记录流数据按照流内顺序和记录边界封装在各个DATA块中,并在DATA块首部记上各自的流ID。一个记录通常对应一个DATA块;对于过长的记录,发送端SCTP既可以像UDP那样拒绝发送,也可以把他们拆分到多个DATA块中以便发送,接收端SCTP收取后把他们组合成单个记录商船,作为传输层PDU的SCTP消息既可以只包含单个块(DATA块或控制块)也可以在接口MTU或路径MTU的限制下包含多个块(称为块的捆绑,控制块在前,DATA块在后),不过INIT块、INIT ACK块和SHUTDOWN COMPLETE块不能跟任何其他块捆绑。SCTP接受两端均独立处理捆绑在同一消息中的各个块。
网络层实体间交换的PDU称为IP数据报(IP datagram),其长度有限:IP数据包最大65535字节,IPv6数据报最大65575字节。发送端IP把来自传输层的消息(或TCP分节)整个封装在IP数据报中传送。俩路层实体间交换的PDU称为帧(frame),其长度取决于具体的接口。IP数据报由IP首部和所承载的传输层数据(即网络层的SDU)构成。过长的IP数据报无法封装在单个帧中,需要先对其SDU进行分片(frgmentation),再把分成的各个片段(fragment)冠以新的IP首部封装到单个帧中。再一个IP数据报从源端到目的段的传送过程中,分片操作既可能发生再源端,也可能发生再途中,而其逆操作即重组(reassembly)一般只发生在目的端;SCTP为了传送过长的记录采取类似的分片和重组措施。TCP/IP协议族为提高效率会尽可能避免IP的分片/重组操作;TCP根据MSS和MTU限定每个分节的大小以及SCTP根据MTU分片/重组过长记录都是这个目的(SCTP的块捆绑则是为了避免IP分片/重组操作的前提下提高块传输效率);另外,IPv6禁止在途中分片操作(基于其路径MTU的发现功能),IPv4也尽量避免这种操作。不论是否分片,都由IP作为链路层的SDU传入链路层,并由链路层封装在帧中的数据称为分组(package,包)。可见一个分组即可能是完整的IP数据报,也可能是某个IP数据报的SDU的一个片段冠以新的IP首部后的结果。其中MSS是应用层和传输层(TCP)之间的接口属性,MTU则是链路层和网络层之间的接口属性。

   PS:[ProcessOn](*https://www.processon.com/network*)是个不错的在线画图工具。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网络编程概述 的相关文章

  • 使用Dockerfile创建docker镜像

    在Dockerfile中用到的命令有 FROM FROM指定一个基础镜像 xff0c 一般情况下一个可用的 Dockerfile一定是 FROM 为第一个指令 至于image则可以是任何合理存在的image镜像 FROM 一定是首个非注释指
  • Ubuntu下软件更新无法安装的问题

    Ubuntu安装软件提示 需要安装不能信任的软件包 解决办法 用 Ubuntu 安装输入法软件包时提示 需要安装不能信任的软件包 xff0c 这个动作需要从没有授权的软件源来安装软件包 xff0c 赋予权限执行仍然无法安装 xff0c 上网
  • 【C#】C#中FTP的操作

    C 完成与FTP服务器交互的功能代码 包括连接FTP 上传文件 下载文件 创建文件夹 删除文件夹 目录列表 获取指定文件大小 对文件的重命名 移动文件 判断路径是否存在等功能 using System using System Collec
  • 深浅层特征融合——CBNet

    写在前面 本系列博客 深浅层特征融合 对几篇出现较新的深浅层特征融合算法进行简要介绍 xff0c 多为本人的论文笔记 xff0c 记录了一个深度学习小学生在看论文时想到的问题 论文题目 xff1a CBNet A Novel Composi
  • U盘安装mips架构的Deepin(或UOS)系统及配置适用的源

    安装环境 请确保您的电脑满足以下的配置要求 xff0c 如果您的电脑配置低于以下要求 xff0c 将无法完美地体验深度操作系统 xff1a 内存 xff1a 至少 2G 内存 RAM xff0c 4G 以上是达到更好性能的推荐值硬盘 xff
  • label smooth方法论文调研

    待看论文 xff1a When Does Label Smoothing Help xff08 重点要看的 xff09 Regularizing Neural Networks by Penalizing Confident Output
  • 动手实践——docker中利用jupyter对数据增强操作进行可视化

    整体流程 docker容器内搭建合适环境 gt 开启jupyter notebook gt 浏览器里敲数据增强操作代码 gt 可视化 搭建环境 参考博客 https segmentfault com a 1190000007448177 1
  • 半监督-SelfMatch-论文阅读笔记

    阅读背景 SimCLR在2020年2月第一次挂在arxiv上 xff0c 被ICML 2020接收 FixMatch在2020年1月第一次挂在arxiv上 xff0c 被NIPS 2020接收 概括总结 SelfMatch方法和 FixMa
  • AI提效工具|借助chatgpt快速读论文,快速总结、归纳、索引相似文章

    目前新论文层出不穷 xff0c 快速阅读论文 成为研究者们一个必备能力 本文简单记录了近期出现的两个借助chatgpt来帮助我们快速读论文的 神器 xff0c 帮助大家快速上手应用 xff0c 迅速提升论文阅读速度 此外 xff0c 本人也
  • 【更新中】目标检测——梳理,准备面试

    最近在准备找工作面试 xff0c 本文在此梳理了目标检测中涉及的面试要用的知识点 xff0c 包含了一下几方面 xff1a My paper reading 过程总结 xff1a 实际步骤所花时间评价改进先看了abstract 1 intr
  • python——迷宫问题总结

    关于迷宫问题 xff0c 常见会问能不能到达某点 xff0c 以及打印到达的最短路径 可以用回溯法 43 递归来解决 代码一 xff1a dfs 43 回溯 将矩阵外围以及路障统一设置为 1 设置current step和next step
  • (等待填坑)深度学习——蒸馏loss、蒸馏学习

    提出问题 参考博客 1 知识蒸馏 2 蒸馏
  • 图像篡改检测方向(Tamper Detection\ image forencis detection)学习笔记汇总(未完成)

    写在前面 最新在啃这个方向的论文 xff0c 零零总总找来了有几十篇 xff0c 目前自己也没看完 xff0c 下图中上面几行标星号的是自己打算多看几眼的 xff1a 这篇博客里会介绍几篇这个方向里做得比较好的几篇论文 demo工具 如果你
  • CELF优化的贪心算法

    用一个例子说明如下 xff1a 问题描述如下 xff1a 从一组节点中 xff0c 取出一组k个种子节点S xff0c 使得产生的增益最大 对任意的a属于A xff0c f a xff1a a加入之后的增益 有如下一个表 xff1a 初始扫
  • Linux磁盘分区基本分区

    目录 前言 一 磁盘简介 1 名词 2 类型 1 xff09 机械硬盘 2 xff09 固态硬盘 3 尺寸 4 接口 IDE和SATA的区别 5 术语 6 命名 7 分区方式 1 xff09 MBR 2 xff09 GPT 二 管理磁盘 1
  • 使用shell并发执行系统命令

    一 解决方案 旧方案为挨个执行shell exec xff0c 串行执行 xff0c 虽然执行很快 xff0c 奈何监听命令众多 xff0c redis连接有等待时间等 xff0c 有的还需要执行多次取平均值 xff0c 所以执行完已超过1
  • 基于C语言实现(WinForm)FIFA球队管理系统【100010337】

    1 引言 1 1 编写目的 在如今市场上 xff0c 各种评估分析类的软件层出不穷 作为当今世界上最受欢迎的球类之一 足球 xff0c 也以之为题材产生了世人所知的足球管理类游戏 xff0c FIFA足球经理 但是 xff0c 由于其占用内
  • Ubuntu18.04下CUDA10.x和TensorFlow1.x环境搭建(2019.7重编版)

    目录 前言开发环境一览 显卡驱动安装 下载驱动 禁用nouveau 安装驱动 安装CUDA 10 x第一个CUDA程序 安装cudnn7 x安装TensorFlow1 x最后 Mac和Ubuntu下修改pip源和TensorFlow CPU
  • 数通运营商方向常见面试问题(第五部分)

    VXLAN以主要应用在哪里 和传统的二层网络相比 xff0c 有什么优势7 数据中心 首先描述传统二层VPN的缺点 xff1a 传统二层要用STP 收敛慢 链路利用率低不合适 传统VPLS为解决环路会采用STP技术 xff0c CE到PE采
  • Xshell 6 首次连接虚拟机 CentOS 6.8报错:/usr/bin/xauth: file /root/.Xauthority does not exist

    首次连接虚拟机时会提示 usr bin xauth file root Xauthority does not exist xff0c xff0c 这个没关系 xff0c 系统在连接之后会自动创建 xff0c 再次连接时就好了 如下图 xf

随机推荐

  • 一个不喜欢读书的Javaer的读书单

    很可惜 xff0c 从我一开始学技术开始 xff0c 我就不喜欢看书 xff0c 严重的时候翻不到两页就会开始狂打瞌睡 很幸运 xff0c 有互联网能够为我提供很多知识 xff0c 甚至一些知识从网上看来的会更加权威一些 但是 xff0c
  • 【分享】Ubuntu桌面版图形界面下换源

    写在前面 xff1a 由于操作极其简单 xff0c 所以一开始还犹豫要不要单独写篇文章 xff0c 但是后来上网查了以下 xff0c 发现主流都是修改sources list文件的方法 xff08 这种方法的教程见下面的连接 xff0c 这
  • java 之产生死锁的必要条件

    1 死锁 怎么去打破 1 死锁发生的原因 是多个进程并发请求 争夺系统资源而产生的相互等待情况 2 本质问题 xff1a 1 系统资源有限 2 进程推进顺序不合理 3 死锁产生的4个必要条件 xff1a 3 1 进程互斥 资源分配给进程之后
  • MAC 安装tree : fatal error: 'stdlib.h' file not found

    MAC 安装tree fatal error 39 stdlib h 39 file not found 未安装 Command Line Tools命令行工具 xff0c 安装步骤如下 xff1a 在终端中输入 xcode select
  • blog记录

    blog记录 blog整理linux内核redis云 43 负载均衡算法git blog整理 linux内核 https blog csdn net gatieme article category 9265324 Linux内核剖析 xf
  • Git撤销&回滚操作(git reset 和 get revert)

    git 工作流 xff1a 工作区 xff1a 即自己当前分支所修改的代码 xff0c git add xx 之前的 xff01 不包括 git add xx 和 git commit xxx 之后的 暂存区 xff1a 已经 git ad
  • 51单片机——计数器与定时器的区别

    定时器和计数器是同一器件 计数器 其共同的特点是都有一个计数脉冲输入端 每输入一个脉冲 计数器就进行加1或减1计数 若计数器件的计数脉冲的频率固定 则可利用计数实现定时 这就是定时器 若计数器件的作用仅仅是记录输入脉冲的多少 则称为计数器
  • git学习笔记

    本地仓 lt gt 暂存区 lt gt 版本库 撤销 xff1a 已修改的文件test c xff0c 撤销 git checkout test c 必须要 xff0c 不然就会切换分支已修改的文件并使用 git add 添加到暂存区 gi
  • github提交代码-简介

    使用步骤 在 github 上 fork 一个项目到自己的仓库 需要先fork xff0c 因为原始项目没有权限git clone https github com name repos git 从自己的仓下 clone代码到本地修改本地代
  • linux时间相关结构体和函数整理

    一 时间类型 Linux下常用的时间类型有4个 xff1a time t xff0c struct timeb struct timeval xff0c struct timespec xff0c clock t struct tm 1 t
  • xargs 命令

    xargs xargs 命令 用途 构造参数列表并运行命令 大多数 Linux 命令都会产生输出 xff1a 文件列表 字符串列表等 但如果要使用其他某个命令并将前一个命令的输出作为参数该怎么办 xff1f 例如 xff0c file 命令
  • fedora20安装putty No package ‘gtk+-2.0′ found

    这里转载一下 我在编译安装emacs23的时候提示No package gtk 43 2 0 found centos的开发环境 网上搜了一下 xff0c 发现安装gtk 43 2 0不是一件容易的事 xff0c 后来无意发现一个帖子挺不错
  • Reverse Words in a String

    Given an input string reverse the string word by word For example Given s 61 34 the sky is blue 34 return 34 blue is sky
  • Linked List Cycle

    Given a linked list determine if it has a cycle in it Follow up can you solve it without using extra space 最初代码 xff0c 错误
  • Linked List Cycle II

    Given a linked list return the node where the cycle begins If there is no cycle return null Follow up Can you solve it w
  • Evaluate Reverse Polish Notation

    Evaluate the value of an arithmetic expression in Reverse Polish Notation Valid operators are 43 Each operand may be an
  • Insertion Sort List

    Sort a linked list using insertion sort 对一个线性链表排序 xff0c 维护两对指针即可 ListNode insertionSortList ListNode head if head return
  • mac上忘记mysql密码完美解决方案

    最近项目用到mysql xff0c 之前装过一个 xff0c 可是忘记了当时设置的密码 xff0c 然后走上了修改密码的坎坷道路 在百度 xff0c Google了一堆资料之后还是 xff0c 发现处处是给程序员埋的坑 于是下决心 xff0
  • Word Search

    Given a 2D board and a word find if the word exists in the grid The word can be constructed from letters of sequentially
  • 网络编程概述

    今天开始正式学习网络编程这一块 xff0c 特做此笔记记录学习过程 要编写通过计算机网络通信的程序 xff0c 首先要确定这些程序相互通信所用的protocol 在深入设计一个协议的细节之前 xff0c 应该从高层次决断通信由哪个程序发起以