最近刚看完电影「无敌破坏王2:大闹互联网」
,以为里面有些动画蛮有意思的,因而想起前不久看的《图解HTTP》和TCP/IP
相关的文章。嗯,是时候展现真正的技术了。前端
若是你还对各种协议归属、做用也都傻傻分不清,那么你有必要详尽了解下TCP/IP
。vue
TCP/IP
协议族互联网协议套件(英语:Internet Protocol Suite,缩写
IPS
)是一个网络通信模型,以及一整个网络传输协议家族,为网际网络的基础通信架构。它常被通称为TCP/IP协议族(英语:TCP/IP Protocol Suite
,或TCP/IP Protocols
),简称TCP/IP
。由于该协定家族的两个核心协定:TCP(传输控制协议)和IP(网际协议)
,为该家族中最先经过的标准。web
敲重点:面试
TCP(传输控制协议)和IP(网际协议
是最早定义的两个核心协议,因此才统称为TCP/IP协议族
TCP/IP
拆家分层TCP/IP
协议族中有一个很重要一点就是分层管理,依次为如下四层,应用层,传输层,网络层,数据链路层。vue-cli
TCP/IP
分层管理是有好处的,假如互联网只有一个协议统筹,某一个地方改变设计时,就须要把全部部分都替换掉,而分层只须要把变更的层替换掉便可。
并且分层管理,设计也相对简单,处于应用层的应用只须要考虑分派本身的任务而不须要考虑对方的传输线路是怎样的,可否保证传输送达。后端
Application Layer
应用层是大多数普通与网络相关的程序为了经过网络与其余程序通讯所使用的层。这个层的处理过程是应用特有的;数据从网络相关的程序以这种应用内部使用的格式进行传送,而后被编码成标准协议的格式。设计模式
应用层决定了向用户提供的应用服务时的通讯活动:安全
HTTP
(万维网服务)FTP
(文件传输)SMTP
(电子邮件)SSH
(安全远程登录)DNS
(名称<-> IP地址寻找,域名系统)一旦从应用程序来的数据被编码成一个标准的应用层协议,它将被传送到IP栈的下一层。 bash
Transport Layer
传输层位于应用层的下层,提供位于网络链接中的两台计算机之间的数据传输,传输层中有两种性质不一样的协议网络
敲重点:每个应用层协议通常都会使用到两个传输层协议之一
TCP
:面向链接的Transmisson Control Protocol
传输控制协议UDP
: 无链接的包传输User DataProtocol
用户数据报协议UDP | TCP | |
---|---|---|
是否链接 | 无链接 | 面向链接 |
是否可靠 | 不可靠传输,不使用流量控制和拥塞控制 | 可靠传输,使用流量控制和拥塞控制 |
链接对象个数 | 支持一对一,一对多,多对一和多对多交互通讯 | 只能是一对一通讯 |
传输方式 | 面向报文 | 面向字节流 |
首部开销 | 首部开销小,仅8字节 | 首部最小20字节,最大60字节 |
场景 | 适用于实时应用(IP电话、视频会议、直播等) | 适用于要求可靠传输的应用,例如文件传输 |
摘自:TCP和UDP比较
网络层的功能使咱们可以将数据包从一台机器传送到网络上的另外一台机器,但这还不足以编写网络应用程序,由于:
TCP
经过定义端口号解决了第一个问题:
端口号本质上是标识符,有助于TCP
区分机器上运行的应用。
换句话说,计算机上的每一个端口号都由该计算机上的应用拥有。
端口号是2字节整数,端口0不可用。所以,咱们能够在一台机器上拥有多达65536个端口。
TCP经过端口号来定义“链接”。
TCP链接由源和目标IP地址(来自网络层)以及源和目标端口号标识。这也称为四元组:
// 源IP地址、目的IP地址、源端口、目的端口
(src ip,dst ip,src port,dst port)
复制代码
SEQ
和ACK
,序列号与确认号TCP网络中,为了保障每一个链接提供有保证和有序的字节传递,使用了Sequence Number
(,序列号)和 Acknowledgment Number
(确认号),即Seq
和Ack
。
TCP
每次发送与接受的单位为: TCP
头部 + 数据, TCP数据段 (TCP Segment
);
每一个数据段的大小不尽相同,有可能数百~数万。
SEQ
,序列号,表示每次传输中字节的偏移量 ACK
,确认号,指出下一个指望接收的SEQ
(接受完毕)
举个例子:
#2000
且长度为100
的数据包,在此链接上包含第2000-2099
个字节。2099
字节在内的全部字节时,它发送一个确认#2100
。2100
字节以前接收到该字节。SYN
,同步序列号ISN
产生器,产生各自的 初始序列号 (Initial Sequence Number, ISN
), 一般二者并不相等。SYN
,让两端的 TCP
必须进行 ISN
的交换 (同步)。
好吧,说人话。就是TCP三次握手:
这就是 TCP
链接的创建方式, 且 2
和 3
,能够组合为单一讯息。
因而便有下图:
且第三次握手中 (Client — — > Server
), 其 SEQ
為 第一段的值 + 1 (ISN + 1)。
Network Layer
网络层用来处理在网络上流动的数据包(数据包:网络上传输的最小数据单位)。
网络层规定在众多选项中经过怎样的路径(传输线路)到达对方的计算机,把数据包传输给对方。
该层中最突出的协议是Internet协议(IP)
,所以该层也称为IP
层。IP
的核心是两个主要功能:地址和路由。
IP
的原始版本是
IPV4
,后来扩展了
IPV6
:
IPv4
中规定IP
地址长度为32,即有2^32-1个节点(40亿)。IPv6
中IP
地址的长度为128,即有2^128-1个节点(2125亿)IPV6
被普遍应用之后,全世界的每一粒沙子都会有相对应的一个IP地址。今天,大多数机器都有IPv4
和IPv6
地址。若是运行ifconfig
,则能够看到计算机的IPv4
和IPv6
地址。
~ ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
options=1203<RXCSUM,TXCSUM,TXSTATUS,SW_TIMESTAMP>
inet 127.0.0.1 netmask 0xff000000
inet6 ::1 prefixlen 128
inet6 fe80::1809:1%lo0 prefixlen 64 scopeid 0x1
nd6 options=201<PERFORMNUD,DAD>
media: autoselect
status: active
复制代码
IP路由基于使用地址前缀的规则构构建。 若是在计算机上运行 netstat -rn
,则能够在计算机上看到路由表。
10.31.10/24
的IP数据包应该发送到link#8
。它就像
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数据包路由到达目的地的方式。
若是您想了解如何在网络中将数据包路由到掘金juejin.im
,请运行如下命令:
traceroute juejin.im
复制代码
就会获得下图:
Link Layer
(又名数据链路层,网络接口层)
用来处理链接网络中的硬件部分,硬件上的范围均在链路层中,包含
ifconfig
: 查看MAC
地址在任何网络中,每一个节点都具备 “邻居”。链路层协议提供经过链路直接链接的“邻居”之间通讯所需的功能(例如,像CAT5电缆的物理链路,或WiFi中的无线电链路)。
最着名的链路层协议是以太网。在以太网中,每一个接口都有一个惟一的48位(6字节)地址,称为媒体访问控制(MAC)地址。
若是在计算机上运行ifconfig
,您将看到网络接口的名称及其MAC
地址。
~ ifconfig
...
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> 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<PERFORMNUD,DAD>
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地址之间的映射关系。
而后便一层层包裹,解析。
TCP
和 UDP
的协议每个应用层(TCP/IP参考模型的最高层)协议通常都会使用到两个传输层协议之一:
运行在TCP协议
上的协议:
HTTP(Hypertext Transfer Protocol,超文本传输协议)
,主要用于普通浏览。HTTPS(HTTP over SSL,安全超文本传输协议)
,HTTP
协议的安全版本。FTP(File Transfer Protocol,文件传输协议)
,用于文件传输。POP3(Post Office Protocol, version 3,邮局协议)
,收邮件用。SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)
,用来发送电子邮件。TELNET(Teletype over the Network,网络电传)
,经过一个终端(terminal)
登录到网络。SSH(Secure Shell,用于替代安全性差的TELNET)
,用于加密安全登录用。运行在UDP协议
上的协议:
BOOTP(Boot Protocol,启动协议)
,应用于无盘设备。NTP(Network Time Protocol,网络时间协议)
,用于网络同步。DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)
,动态配置IP地址。运行在TCP
和UDP
协议上:
DNS(Domain Name Service,域名服务)
,用于完成地址查找,邮件转发等工做。逛国外社区看到这篇,以为挺简洁明了的。
只是以为好玩就简单总结一下,有说错的地方多担待。
意思就是写得略粗糙,别喷我。。。
若是你以为这篇内容对你挺有启发,我想邀请你帮我三个小忙: