计算机网络再次整理————tcp例子前奏[三]
前言
简单编写一下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例子前奏[三]的更多相关文章
- 计算机网络再次整理————tcp例子第二前奏[四]
前言 前文我们介绍了网络协议的各层,同时也介绍了一下我们在编写代码时候的服务端的accept.bind.listen.connect.send做了什么. 可以说是从宏观的角度,或者代码开发的角度来说的 ...
- 计算机网络再次整理————tcp例子[五]
前言 本文介绍一些tcp的例子,然后不断完善一下. 正文 服务端: // See https://aka.ms/new-console-template for more information us ...
- 计算机网络再次整理————tcp周边[八]
前言 tcp的包的格式可以看我以前的计算机网络整理,下面这些周边只是为了开发时候我们能用到一些理论知识. 正文 首先要介绍的就是域名,为啥有域名这东西呢?单纯站在网络的角度上讲这属于应用层的东西了. ...
- 计算机网络再次整理————tcp的关闭[七]
前言 tcp的关闭不是简单粗暴的,相对而言是友好优雅的,好聚好散吧. 那么友好的关闭方式是这样的: 假设这里是客户端请求关闭的,服务端倒过来. 客户端:我要请求关闭 服务端:我接收到你的请求了,等我把 ...
- 计算机网络再次整理————tcp[二]
前言 本文不会去介绍tcp的具体协议,因为这个tcp 应该不能说是单纯的连接和传输数据这么简单,里面还有很多机制. 正文 首先介绍一下什么是协议族(protocal Family),举个例子PF_IN ...
- 计算机网络再次整理————UDP例子[六]
前言 简单的说,UDP 没有 TCP 用的广泛,但是还有很多是基于UDP的程序的,故而简单介绍一下. 正文 秉承节约脑容量的问题,只做简单的介绍和例子,因为自己几乎也没怎么用过UDP. 只是了解和知晓 ...
- 计算机网络再次整理————socket[一]
前言 以前也整理过吧,写了几篇之后,感觉没啥整理的必要了然后就放弃了,最近又想整理一下. 正文 这篇对应的是:https://www.cnblogs.com/aoximin/p/12235333.ht ...
- TCP协议的三次握手和四次分手
HTTP连接 HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用. ...
- tcp为什么要三次握手,而不能二次握手?
谢希仁版<计算机网络>中的例子是这样的,"已失效的连接请求报文段"的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞 ...
随机推荐
- Towards Deep Learning Models Resistant to Adversarial Attacks
目录 概 主要内容 Note Madry A, Makelov A, Schmidt L, et al. Towards Deep Learning Models Resistant to Adver ...
- 【jvm】05-为什么你写的代码有时候和预期不一致
[jvm]05-为什么你写的代码有时候和预期不一致 欢迎关注b站账号/公众号[六边形战士夏宁],一个要把各项指标拉满的男人.该文章已在github目录收录. 屏幕前的大帅比和大漂亮如果有帮助到你的话请 ...
- 【03】SpringBoot2核心技术-核心功能—数据访问_单元测试_指标监控
3.数据访问(SQL) 3.1 数据库连接池的自动配置-HikariDataSource 1.导入JDBC场景 <dependency> <groupId>org.spring ...
- Dom 键盘事件以及实战案例
键盘事件 //键盘操作 //1.某键盘按下执行的操作 document是对文档进行触发 document.onkeyup = function(){ console.log('你好') } docum ...
- hisql 新一代无实体ORM使用第一步 hisql安装使用
安装 github hisql 最新源码下载 也可以通过nuget安装 注意:HiSql仅支持.net5或以上环境 选择您需要支持的数据库对应的支持包进行安装 本例使用sqlserver进行演示,请安 ...
- 初识python: 模块定义及调用
一.定义 模块:用来从逻辑上组织python代码(变量.函数.类.逻辑:实现一个功能),本质就是.py结尾的python文件(比如:文件名:test.py,对应的模块名:test) 包:用来从逻辑上组 ...
- 您应该知道的35个绝对重要的Linux命令
https://mp.weixin.qq.com/s?__biz=MzU3NTgyODQ1Nw==&mid=2247499293&idx=2&sn=1353b78d6ad01d ...
- Centos7 安装LAMP以及nextcloud
第一步:安装apache 在centos中 apache叫httpd yum update #更新源 yum install httpd #安装apache systemctl stop firewa ...
- spring boot 启动警告 WARN 15684 --- [ restartedMain] c.n.c.sources.URLConfigurationSource : No URLs will be polled as dynamic configuration sources. 解决
添加一个配置文件config.properties ,即便是空的也是可以的
- spring boot热部署 -- 实现 后端java热更新 -- 详细操作 【idea 的 JRebel破解】
1.前言 上一随笔写了如何使得spring boot热更新前端 ,但后端java部分无法热更新. 对于Java热更新,以前常使用 springloaded ,但是缺点 和bug很多 无法实现真正意 ...