前言

简单编写一下tcp例子。

正文

我们常说IOS有7层,实际上也只有4层,或者这样说简单的说是4层。

首先是数据链路层,首先这一层解决了什么问题呢?为什么要有这一层呢?

首先要抛开有操作系统的意识,因为它为我们做了太多东西了,摆在你面前的只有两个终端和一根网线。

数据链路层定义了在单个链路上如何传输数据。这些协议与被讨论的各种介质有关。示例:ATM,FDDI等。数据链路层必须具备一系列相应的功能,主要有:如何将数据组合成数据块,在数据链路层中称这种数据块为帧,帧是数据链路层的传送单位;如何控制帧在物理信道上的传输,包括如何处理传输差错,如何调节发送速率以使与接收方相匹配;以及在两个网络实体之间提供数据链路通路的建立、维持和释放的管理。

这里最好奇的是封装成帧:

封装成帧(framing):就是在一段数据的前后分别添加首部和尾部,这样就构成了一个帧。接收端在收到物理层上交的比特流后,就能根据首部和尾部的标记,从收到的比特流中识别帧的开始和结束。

这样就相当于有切割了,我们一直传输的是0和1,比如我们按照顺序传输的是01101001010101010101010101010。

接收机也的确收到了这个信息了,但是没法知道具体含义啊。这就很尴尬了。

但是我这样传输,如果在前面加标记说是开始,然后加标记结束,这样不就是ok的啊。然后我们都用默认的utf8,这样不就形成了一段话啊。

简直完美极了。这个想法,我自己都能想出来。就像在古代,也有飞行的想法,在人身上装两个翅膀呗。

这就是想法是美好的,但是怎么做呢? 我应该设置什么标志让其知道是开始呢?会不会和我的发送的数据冲突呢?

(1)如何识别帧的开始与结束;(2)在夹杂着重传的数据帧中,接收方在接收到重传的数据帧时是识别成新的数据帧,还是识别成已传帧的重传帧呢?

现在有了想法,那就来解决问题。

首先解决一个这样的问题,那就是SOH和EOT的问题。

那就是设置01(二进制是00000001)和04(二进制是00000100),分别为帧开始的标志和帧结束的标志后。

那么如果我数据中也存在01和04怎么办呢? 这个时候就要转义了。如果出现了01和04那么就要转成别的了。

这个知道转义符的都怎么哈,就不用太多解释了。

解决方法:发送端的数据链路层在数据中出现控制字符”SOH”和”EOT”的前面插入一个转义字符”ESC”(其十六进制编码是1B)。而在接收端的数据链路层在将数据送往网络层之前删除这个插入的转义字符。这种方法称为字节填充(byte stuffing)或字符填充(character stuffing)。如果转义字符也出现在数据当中,那么解决方法仍然是在转义字符的前面插入一个转义字符。因此,当接收端收到连续的两个转义字符时,就删除其中前面的一个。

如下图:

然后还有一些帧的问题需要解决了,这里也不可能列举,实际上还有帧的丢失、帧的重复等帧的问题了。

现在假如帧的问题解决了,解决了点与点的问题,那么还有一个问题就是假如一台机器连接了几台机器。

那么我要向起一台机器发送消息怎么办呢? 这个时候就有一下协议产生了,比较著名的是以太网协议了。

它就是说在相连接的机器,每个都发送消息,检查mac是否相等,就收到,不是就丢弃。

这都是有历史的,总之呢,现在相邻的机器可以互相发送消息了。

但是后来电脑越来越多,然后呢,如果要向每台电脑发送信息的话,那是不是有点问题啊,这样层层发送下去,就很不方便。

也就有了网络层了,之所以叫网络层就是电脑越来越多,像网状结构一样,ip协议也就是为了解决这样的问题的。

那就是因为以太网这种协议不适合互联网了。所以说,网络层解决了目的主机和源主机的通信。

好了,现在每两台机器之间可以通信了,那么是不是就ok了呢?

为什么tcp这样的传输层协议出现呢? 目的主机和源主机能够通信了这很好。

但是就是有这样的需求,第一条消息必须比第二条信息后到。我要传输大数据啊,你这不行啊,ip协议发包是有限制的啊。

后面就有很多公司有自己的协议了。比较出名的就是tcp了,解决了传输大数据的问题,按照顺序传输,我给你组装呗。

这一层解决了,数据制定了数据传输的规则,所以叫做传输层呗。

理论上你要大数据有数据了,传输规则你也定了,理论上数据传输是没有问题的呀,数据传输得到了保障啊。

你有啥问题,你可以提的嘛。这时候随着软件的发展哈,还就真的有新的问题了。

软件行业就有问题哈,你这个数据能到是没有问题了。但是这个数据格式有问题啊。

一开始你传123给我,我传456给你,大家都玩得比较开心的。

后来软件越来越复杂了,就有了很多格式了,后来不同格式多了就有了协议了。举个例子,比如http。

因为是解决应用的问题,所以叫做应用层。

总之,如果向学习哪一层,就看哪一层是做什么的,解决什么问题。下一章就是具体的例子了。

计算机网络再次整理————tcp例子前奏[三]的更多相关文章

  1. 计算机网络再次整理————tcp例子第二前奏[四]

    前言 前文我们介绍了网络协议的各层,同时也介绍了一下我们在编写代码时候的服务端的accept.bind.listen.connect.send做了什么. 可以说是从宏观的角度,或者代码开发的角度来说的 ...

  2. 计算机网络再次整理————tcp例子[五]

    前言 本文介绍一些tcp的例子,然后不断完善一下. 正文 服务端: // See https://aka.ms/new-console-template for more information us ...

  3. 计算机网络再次整理————tcp周边[八]

    前言 tcp的包的格式可以看我以前的计算机网络整理,下面这些周边只是为了开发时候我们能用到一些理论知识. 正文 首先要介绍的就是域名,为啥有域名这东西呢?单纯站在网络的角度上讲这属于应用层的东西了. ...

  4. 计算机网络再次整理————tcp的关闭[七]

    前言 tcp的关闭不是简单粗暴的,相对而言是友好优雅的,好聚好散吧. 那么友好的关闭方式是这样的: 假设这里是客户端请求关闭的,服务端倒过来. 客户端:我要请求关闭 服务端:我接收到你的请求了,等我把 ...

  5. 计算机网络再次整理————tcp[二]

    前言 本文不会去介绍tcp的具体协议,因为这个tcp 应该不能说是单纯的连接和传输数据这么简单,里面还有很多机制. 正文 首先介绍一下什么是协议族(protocal Family),举个例子PF_IN ...

  6. 计算机网络再次整理————UDP例子[六]

    前言 简单的说,UDP 没有 TCP 用的广泛,但是还有很多是基于UDP的程序的,故而简单介绍一下. 正文 秉承节约脑容量的问题,只做简单的介绍和例子,因为自己几乎也没怎么用过UDP. 只是了解和知晓 ...

  7. 计算机网络再次整理————socket[一]

    前言 以前也整理过吧,写了几篇之后,感觉没啥整理的必要了然后就放弃了,最近又想整理一下. 正文 这篇对应的是:https://www.cnblogs.com/aoximin/p/12235333.ht ...

  8. TCP协议的三次握手和四次分手

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

  9. tcp为什么要三次握手,而不能二次握手?

    谢希仁版<计算机网络>中的例子是这样的,"已失效的连接请求报文段"的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞 ...

随机推荐

  1. 【LeetCode】300. Longest Increasing Subsequence 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  2. RocketMQ 消息丢失场景分析及如何解决

    生产者产生消息发送给RocketMQ RocketMQ接收到了消息之后,必然需要存到磁盘中,否则断电或宕机之后会造成数据的丢失 消费者从RocketMQ中获取消息消费,消费成功之后,整个流程结束 1. ...

  3. Java实习生常规技术面试题每日十题Java基础(二)

    目录 1. JAVA 的反射机制的原理. 2.静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同? 3.如何将String类型转化成Number类型. 4.什 ...

  4. MyBatis 一级缓存实现详解及使用注意事项

    一级缓存介绍 在应用运行过程中,我们有可能在一次数据库会话中,执行多次查询条件完全相同的SQL,MyBatis提供了一级缓存的方案优化这部分场景,如果是相同的SQL语句,会优先命中一级缓存,避免直接对 ...

  5. VoIP语音处理流程和知识点梳理

    做音频软件开发10+年,包括语音通信.语音识别.音乐播放等,大部分时间在做语音通信.做语音通信中又大部分时间在做VoIP语音处理.语音通信是全双工的,既要把自己的语音发送出去让对方听到,又要接收对方的 ...

  6. 初识python: 模块定义及调用

    一.定义 模块:用来从逻辑上组织python代码(变量.函数.类.逻辑:实现一个功能),本质就是.py结尾的python文件(比如:文件名:test.py,对应的模块名:test) 包:用来从逻辑上组 ...

  7. java 短路与(||)时报错The operator || is undefined for the argument type(s) int, boolean

    今天在使用短路与时,报错The operator || is undefined for the argument type(s) int, boolean 代码如下: 最后发现是少了一个=,比较要使 ...

  8. vue2.0与vue3.0项目创建

    脚手架安装与卸载 安装 npm install -g vue-cli //or npm install -g @vue/cli 卸载 npm uninstall -g vue-cli //or npm ...

  9. 机器学习|线性回归算法详解 (Python 语言描述)

    原文地址 ? 传送门 线性回归 线性回归是一种较为简单,但十分重要的机器学习方法.掌握线性的原理及求解方法,是深入了解线性回归的基本要求.除此之外,线性回归也是监督学习回归部分的基石. 线性回归介绍 ...

  10. 服务监控 | 彻底搞懂Dropwizard Metrics一篇就够了

    Metrics是一个提供服务性能检测工具的Java类库,它提供了功能强大的性能指标工具库用于度量生产环境中的各关键组件性能. 度量类型 Metrics提供了以下几种基本的度量类型: Gauge:用于提 ...