「多图警告」重学 TCP/IP 协议-程序员宅基地

前言

最近刚看完电影 「无敌破坏王2:大闹互联网」,觉得里面有些动画蛮有意思的,于是想起前不久看的《图解HTTP》和 TCP/IP相关的文章。嗯,是时候展示真正的技术了。

如果你还对各类协议归属、作用也都傻傻分不清,那么你有必要详尽了解下 TCP/IP

640?wx_fmt=png

1. TCP/IP协议族

640?wx_fmt=png

互联网协议套件(英语:Internet Protocol Suite,缩写 IPS)是一个网络通讯模型,以及一整个网络传输协议家族,为网际网络的基础通讯架构。它常被通称为TCP/IP协议族(英语:TCP/IPProtocolSuite,或 TCP/IPProtocols),简称 TCP/IP。因为该协定家族的两个核心协定:TCP(传输控制协议)和IP(网际协议),为该家族中最早通过的标准。

敲重点:

  • TCP(传输控制协议)和IP(网际协议 是最先定义的两个核心协议,所以才统称为 TCP/IP协议族

1.1 TCP/IP拆家分层

TCP/IP协议族中有一个很重要一点就是分层管理,依次为以下四层,应用层,传输层,网络层,数据链路层。

640?wx_fmt=jpeg TCP/IP分层管理是有好处的,假如互联网只有一个协议统筹,某一个地方改变设计时,就需要把所有部分都替换掉,而分层只需要把变动的层替换掉即可。

而且分层管理,设计也相对简单,处于应用层的应用只需要考虑分派自己的任务而不需要考虑对方的传输线路是怎样的,能否保证传输送达。

2. 应用层, ApplicationLayer

应用层是大多数普通与网络相关的程序为了通过网络与其他程序通信所使用的层。这个层的处理过程是应用特有的;数据从网络相关的程序以这种应用内部使用的格式进行传送,然后被编码成标准协议的格式。

应用层决定了向用户提供的应用服务时的通信活动:

  • HTTP(万维网服务)

  • FTP(文件传输)

  • SMTP(电子邮件)

  • SSH(安全远程登陆)

  • DNS(名称<-> IP地址寻找,域名系统)

  • 以及许多其他协议

一旦从应用程序来的数据被编码成一个标准的应用层协议,它将被传送到IP栈的下一层。640?wx_fmt=gif

图中用到HTTP和DNS

3. 传输层, TransportLayer

传输层位于应用层的下层,提供位于网络连接中的两台计算机之间的数据传输,传输层中有两种性质不同的协议

敲重点:每一个应用层协议一般都会使用到两个传输层协议之一

  • TCP:面向连接的 TransmissonControlProtocol传输控制协议

  • UDP : 无连接的包传输 UserDataProtocol用户数据报协议


UDP TCP
是否连接 无连接 面向连接
是否可靠 不可靠传输,不使用流量控制和拥塞控制 可靠传输,使用流量控制和拥塞控制
连接对象个数 支持一对一,一对多,多对一和多对多交互通信 只能是一对一通信
传输方式 面向报文 面向字节流
首部开销 首部开销小,仅8字节 首部最小20字节,最大60字节
场景 适用于实时应用(IP电话、视频会议、直播等) 适用于要求可靠传输的应用,例如文件传输

摘自:TCP和UDP比较

3.1 传输层的意义

网络层的功能使我们能够将数据包从一台机器传送到网络上的另一台机器,但这还不足以编写网络应用程序,因为:

  • 机器可以运行多个应用程序,我们需要知道哪个应用程序应该接收数据包。

  • 网络层可以丢弃或重新排序数据包。另一方面,应用程序通常需要保证(即,无损耗)和按顺序传输字节。

3.2 何为“四元组”?

TCP通过定义端口号解决了第一个问题:

端口号本质上是标识符,有助于 TCP区分机器上运行的应用。

换句话说,计算机上的每个端口号都由该计算机上的应用拥有。

端口号是2字节整数,端口0不可用。因此,我们可以在一台机器上拥有多达65536个端口。

TCP通过端口号来定义“连接”。

TCP连接由源和目标IP地址(来自网络层)以及源和目标端口号标识。这也称为四元组:

// 源IP地址、目的IP地址、源端口、目的端口	
(src ip,dst ip,src port,dst port)

3.3 SEQ和 ACK,序列号与确认号

TCP网络中,为了保障每个连接提供有保证和有序的字节传递,使用了 SequenceNumber (,序列号)和 AcknowledgmentNumber (确认号),即 Seq和 Ack

TCP 每次发送与接受的单位为:TCP头部 + 数据, TCP数据段 ( TCPSegment);640?wx_fmt=png

每个数据段的大小不尽相同,有可能数百~数万。

SEQ,序列号,表示每次传输中字节的偏移量 ACK,确认号,指出下一个期望接收的 SEQ(接受完毕)

举个例子:

  1. 序列号为 2000且长度为 100的数据包,在此连接上包含第 2000-2099个字节。

  2. 当接收器接收到包括第 2099字节在内的所有字节时,它发送一个确认 2100

  3. 表示它已在第 2100字节之前接收到该字节。

3.4 SYN,同步序列号

  • 为了避免与先前连线的数据段混淆,当次连线建立时,序列号 并非从 0 开始。

  • 两端会使用 ISN产生器,产生各自的 初始序列号 ( InitialSequenceNumber,ISN), 通常两者并不相等。

  • 连线建立时,透过 控制位元 (Control Bits) 中的 SYN,让两端的 TCP 必须进行 ISN的交换 (同步)。640?wx_fmt=png

好吧,说人话。就是TCP三次握手

这就是 TCP连接的建立方式, 且 2 和 3,可以组合为单一讯息。

于是便有下图:

640?wx_fmt=png

且第三次握手中 ( Client>Server), 其 SEQ為 第一段的值 + 1 (ISN + 1)。

4. 网络层, NetworkLayer

网络层用来处理在网络上流动的数据包(数据包:网络上传输的最小数据单位)。

网络层规定在众多选项中通过怎样的路径(传输线路)到达对方的计算机,把数据包传输给对方。

640?wx_fmt=gif

流动中的数据包

该层中最突出的协议是 Internet协议(IP,因此该层也称为 IP层。IP的核心是两个主要功能:地址和路由

640?wx_fmt=png IP的原始版本是 IPV4,后来扩展了 IPV6

  • IPv4中规定 IP地址长度为32,即有2^32-1个节点(40亿)。

  • 我们网络中已经有超过40亿个节点,鉴于此,促成了IPV6发展。

  • IPv6中 IP地址的长度为128,即有2^128-1个节点(2125亿)

  • 如果 IPV6被广泛应用以后,全世界的每一粒沙子都会有相对应的一个IP地址。

4.1 地址

今天,大多数机器都有 IPv4和 IPv6地址。如果运行 ifconfig,则可以看到计算机的 IPv4和 IPv6地址。

 ~ ifconfig	
lo0: flags=8049&lt;UP,LOOPBACK,RUNNING,MULTICAST&gt; mtu 16384	
    options=1203&lt;RXCSUM,TXCSUM,TXSTATUS,SW_TIMESTAMP&gt;	
    inet 127.0.0.1 netmask 0xff000000	
    inet6 ::1 prefixlen 128	
    inet6 fe80::1809:1%lo0 prefixlen 64 scopeid 0x1	
    nd6 options=201&lt;PERFORMNUD,DAD&gt;	
    media: autoselect	
    status: active

4.2 路由

IP路由基于使用地址前缀的规则构构建。如果在计算机上运行 netstat-rn,则可以在计算机上看到路由表。

  • 例如,我的路由表说任何匹配 10.31.10/24的IP数据包应该发送到 link8

  • 如果仔细观察,可以看到“默认”行。该行是一项特殊规则,表示任何与其他规则不匹配的数据包都应使用此规则进行路由寻址。

它就像 switch/case语句中的 default

% netstat -rn	
Routing tables	
Internet:	
Destination        Gateway            Flags        Refs      Use   Netif 	
default            10.31.10.222       UGSc           54        0     en0	
default            link#17            UCSI            0        0 bridge1      !	
10.31.10/24        link#8             UCS             9        0     en8      !	
Internet6:	
Destination   Gateway       Flags         Netif Expire	
fe80::%lo0/64 fe80::1%lo0   UcI           lo0

互联网上的所有节点都有这些路由表,这就是IP数据包路由到达目的地的方式。

640?wx_fmt=png

如果您想了解如何在网络中将数据包路由到掘金 juejin.im,请运行以下命令:

traceroute juejin.im

就会得到下图:

640?wx_fmt=png

5.链路层, LinkLayer

(又名数据链路层,网络接口层)用来处理连接网络中的硬件部分,硬件上的范围均在链路层中,包含

  • 操作系统

  • 硬件设备驱动

  • NIC(Network interface Card 网络适配器:网卡 )

  • 光纤等物理可见部分

640?wx_fmt=gif

主机,线路,路由器

5.1 ifconfig: 查看 MAC地址

在任何网络中,每个节点都具有 “邻居”。链路层协议提供通过链路直接连接的“邻居”之间通信所需的功能(例如,像CAT5电缆的物理链路,或WiFi中的无线电链路)。

最着名的链路层协议是以太网。在以太网中,每个接口都有一个唯一的48位(6字节)地址,称为媒体访问控制(MAC)地址。

如果在计算机上运行 ifconfig,您将看到网络接口的名称及其 MAC地址。

~  ifconfig	
...	
en0: flags=8863&lt;UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST&gt; mtu 1500	
 ether 88:e9:fe:4c:83:5b	
 inet6 fe80::1809:d41a:a9a:d664%en0 prefixlen 64 secured scopeid 0x8	
 inet 192.168.1.8 netmask 0xffffff00 broadcast 192.168.1.255	
 nd6 options=201&lt;PERFORMNUD,DAD&gt;	
 media: autoselect	
 status: active

如你所见,MAC地址中的每个字节都由十六进制值表示,并以冒号分隔。

通过以太网链路发送的网络数据包具有源和目标 MAC地址。为了发现它的邻居,以太网使用广播查询和通知。使用这些广播机制,另一种称为 ARP的协议可以找到邻居的 MAC和 IP地址之间的映射。如果在计算机上运行 arp,则可以看到此映射。

~ arp -a -n	
? (10.31.xx.xx) at 98:28:xx:2a:cc:xx on en8 ifscope [ethernet]	
? (10.31.xx.xx) at f4:8e:xx38:f5:b5:xx on en8 ifscope [ethernet]	
? (10.31.xx.xx) at 54:ee:xx:e1:33:xx on en8 ifscope [ethernet]	
....

现在我们已经知道MAC和IP地址之间的映射关系。

6. TCP/IP 通信传输流

640?wx_fmt=pngTCP/IP 通过分层管理进行网络通信,发送端从应用层往下走,接收端则往应用层上层走。

然后便一层层包裹,解析。640?wx_fmt=png

  • 发送端,每经过一层会打上该层所属的首部信息。

  • 接收端,每经过一层会把对应的首部信息解析。

7. 扩展:运行在传输层中的 TCP 和 UDP的协议

每一个应用层(TCP/IP参考模型的最高层)协议一般都会使用到两个传输层协议之一:

运行在 TCP协议上的协议:

  • HTTPHypertextTransferProtocol,超文本传输协议),主要用于普通浏览。

  • HTTPSHTTP over SSL,安全超文本传输协议)HTTP协议的安全版本。

  • FTPFileTransferProtocol,文件传输协议),用于文件传输。

  • POP3PostOfficeProtocol,version3,邮局协议),收邮件用。

  • SMTPSimpleMailTransferProtocol,简单邮件传输协议),用来发送电子邮件。

  • TELNETTeletypeover theNetwork,网络电传),通过一个 终端(terminal登陆到网络。

  • SSHSecureShell,用于替代安全性差的TELNET,用于加密安全登陆用。

运行在 UDP协议上的协议:

  • BOOTPBootProtocol,启动协议),应用于无盘设备。

  • NTPNetworkTimeProtocol,网络时间协议),用于网络同步。

  • DHCPDynamicHostConfigurationProtocol,动态主机配置协议),动态配置IP地址。

运行在 TCP和 UDP协议上:

  • DNSDomainNameService,域名服务),用于完成地址查找,邮件转发等工作。

免责声明

只是觉得好玩就简单写了一下,有说错的地方多担待。

640?wx_fmt=gif

~~意思就是写得略粗糙,别喷我。。。~~

求一份深圳的内推

好了,又水完一篇,入正题:

640?wx_fmt=png 

目前本人在(又)准备跳槽,希望各位大佬和HR小姐姐可以内推一份靠谱的深圳前端岗位!996.ICU 就算了。

  • 微信:huab119

  • 邮箱:454274033@qq.com

作者掘金文章总集

  • 「Vue实践」5分钟撸一个Vue CLI 插件

  • 「Vue实践」武装你的前端项目

  • 「中高级前端面试」JavaScript手写代码无敌秘籍

  • 「从源码中学习」面试官都不知道的Vue题目答案

  • 「从源码中学习」Vue源码中的JS骚操作

  • 「从源码中学习」彻底理解Vue选项Props

  • 「Vue实践」项目升级vue-cli3的正确姿势

  • 为何你始终理解不了JavaScript作用域链?

往期精彩回顾

从 URL 输入到页面展现到底发生了什么你未必知道的 49 个 css 知识点

学习方法分享:为何我一年半就能拿到大厂 offer

640?wx_fmt=png

640?wx_fmt=gif

戳“阅读原文”,获取原文地址(能查阅外链)

在看”的永远18岁~

640?wx_fmt=gif

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_29438877/article/details/100147511

智能推荐

艾美捷Epigentek DNA样品的超声能量处理方案-程序员宅基地

文章浏览阅读15次。空化气泡的大小和相应的空化能量可以通过调整完全标度的振幅水平来操纵和数字控制。通过强调超声技术中的更高通量处理和防止样品污染,Epigentek EpiSonic超声仪可以轻松集成到现有的实验室工作流程中,并且特别适合与表观遗传学和下一代应用的兼容性。Epigentek的EpiSonic已成为一种有效的剪切设备,用于在染色质免疫沉淀技术中制备染色质样品,以及用于下一代测序平台的DNA文库制备。该装置的经济性及其多重样品的能力使其成为每个实验室拥有的经济高效的工具,而不仅仅是核心设施。

11、合宙Air模块Luat开发:通过http协议获取天气信息_合宙获取天气-程序员宅基地

文章浏览阅读4.2k次,点赞3次,收藏14次。目录点击这里查看所有博文  本系列博客,理论上适用于合宙的Air202、Air268、Air720x、Air720S以及最近发布的Air720U(我还没拿到样机,应该也能支持)。  先不管支不支持,如果你用的是合宙的模块,那都不妨一试,也许会有意外收获。  我使用的是Air720SL模块,如果在其他模块上不能用,那就是底层core固件暂时还没有支持,这里的代码是没有问题的。例程仅供参考!..._合宙获取天气

EasyMesh和802.11s对比-程序员宅基地

文章浏览阅读7.7k次,点赞2次,收藏41次。1 关于meshMesh的意思是网状物,以前读书的时候,在自动化领域有传感器自组网,zigbee、蓝牙等无线方式实现各个网络节点消息通信,通过各种算法,保证整个网络中所有节点信息能经过多跳最终传递到目的地,用于数据采集。十多年过去了,在无线路由器领域又把这个mesh概念翻炒了一下,各大品牌都推出了mesh路由器,大多数是3个为一组,实现在面积较大的住宅里,增强wifi覆盖范围,智能在多热点之间切换,提升上网体验。因为节点基本上在3个以内,所以mesh的算法不必太复杂,组网形式比较简单。各厂家都自定义了组_802.11s

线程的几种状态_线程状态-程序员宅基地

文章浏览阅读5.2k次,点赞8次,收藏21次。线程的几种状态_线程状态

stack的常见用法详解_stack函数用法-程序员宅基地

文章浏览阅读4.2w次,点赞124次,收藏688次。stack翻译为栈,是STL中实现的一个后进先出的容器。要使用 stack,应先添加头文件include<stack>,并在头文件下面加上“ using namespacestd;"1. stack的定义其定义的写法和其他STL容器相同, typename可以任意基本数据类型或容器:stack<typename> name;2. stack容器内元素的访问..._stack函数用法

2018.11.16javascript课上随笔(DOM)-程序员宅基地

文章浏览阅读71次。<li> <a href = "“#”>-</a></li><li>子节点:文本节点(回车),元素节点,文本节点。不同节点树:  节点(各种类型节点)childNodes:返回子节点的所有子节点的集合,包含任何类型、元素节点(元素类型节点):child。node.getAttribute(at...

随便推点

layui.extend的一点知识 第三方模块base 路径_layui extend-程序员宅基地

文章浏览阅读3.4k次。//config的设置是全局的layui.config({ base: '/res/js/' //假设这是你存放拓展模块的根目录}).extend({ //设定模块别名 mymod: 'mymod' //如果 mymod.js 是在根目录,也可以不用设定别名 ,mod1: 'admin/mod1' //相对于上述 base 目录的子目录}); //你也可以忽略 base 设定的根目录,直接在 extend 指定路径(主要:该功能为 layui 2.2.0 新增)layui.exten_layui extend

5G云计算:5G网络的分层思想_5g分层结构-程序员宅基地

文章浏览阅读3.2k次,点赞6次,收藏13次。分层思想分层思想分层思想-1分层思想-2分层思想-2OSI七层参考模型物理层和数据链路层物理层数据链路层网络层传输层会话层表示层应用层OSI七层模型的分层结构TCP/IP协议族的组成数据封装过程数据解封装过程PDU设备与层的对应关系各层通信分层思想分层思想-1在现实生活种,我们在喝牛奶时,未必了解他的生产过程,我们所接触的或许只是从超时购买牛奶。分层思想-2平时我们在网络时也未必知道数据的传输过程我们的所考虑的就是可以传就可以,不用管他时怎么传输的分层思想-2将复杂的流程分解为几个功能_5g分层结构

基于二值化图像转GCode的单向扫描实现-程序员宅基地

文章浏览阅读191次。在激光雕刻中,单向扫描(Unidirectional Scanning)是一种雕刻技术,其中激光头只在一个方向上移动,而不是来回移动。这种移动方式主要应用于通过激光逐行扫描图像表面的过程。具体而言,单向扫描的过程通常包括以下步骤:横向移动(X轴): 激光头沿X轴方向移动到图像的一侧。纵向移动(Y轴): 激光头沿Y轴方向开始逐行移动,刻蚀图像表面。这一过程是单向的,即在每一行上激光头只在一个方向上移动。返回横向移动: 一旦一行完成,激光头返回到图像的一侧,准备进行下一行的刻蚀。

算法随笔:强连通分量-程序员宅基地

文章浏览阅读577次。强连通:在有向图G中,如果两个点u和v是互相可达的,即从u出发可以到达v,从v出发也可以到达u,则成u和v是强连通的。强连通分量:如果一个有向图G不是强连通图,那么可以把它分成躲个子图,其中每个子图的内部是强连通的,而且这些子图已经扩展到最大,不能与子图外的任一点强连通,成这样的一个“极大连通”子图是G的一个强连通分量(SCC)。强连通分量的一些性质:(1)一个点必须有出度和入度,才会与其他点强连通。(2)把一个SCC从图中挖掉,不影响其他点的强连通性。_强连通分量

Django(2)|templates模板+静态资源目录static_django templates-程序员宅基地

文章浏览阅读3.9k次,点赞5次,收藏18次。在做web开发,要给用户提供一个页面,页面包括静态页面+数据,两者结合起来就是完整的可视化的页面,django的模板系统支持这种功能,首先需要写一个静态页面,然后通过python的模板语法将数据渲染上去。1.创建一个templates目录2.配置。_django templates

linux下的GPU测试软件,Ubuntu等Linux系统显卡性能测试软件 Unigine 3D-程序员宅基地

文章浏览阅读1.7k次。Ubuntu等Linux系统显卡性能测试软件 Unigine 3DUbuntu Intel显卡驱动安装,请参考:ATI和NVIDIA显卡请在软件和更新中的附加驱动中安装。 这里推荐: 运行后,F9就可评分,已测试显卡有K2000 2GB 900+分,GT330m 1GB 340+ 分,GT620 1GB 340+ 分,四代i5核显340+ 分,还有写博客的小盒子100+ 分。relaybot@re...

推荐文章

热门文章

相关标签