OSI 分层 (7 层):物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
TCP/IP 分层(4 层):网络接口层、 网际层、运输层、 应用层。
五层协议 (5 层):物理层、数据链路层、网络层、运输层、 应用层。
每一层的协议如下:
物理层:RJ45、CLOCK、IEEE802.3 (中继器,集线器)
数据链路:PPP、FR、HDLC、VLAN、MAC (网桥,交换机)
网络层:IP、ICMP、ARP、RARP、OSPF、IPX、RIP、IGRP、 (路由器)
传输层:TCP、UDP、SPX
会话层:NFS、SQL、NETBIOS、RPC
表示层:JPEG、MPEG、ASII
应用层:FTP、DNS、Telnet、SMTP、HTTP、WWW、NFS
每一层的作用如下:
物理层:通过媒介传输比特, 确定机械及电气规范(比特 Bit)
数据链路层:将比特组装成帧和点到点的传递(帧 Frame)
网络层:负责数据包从源到宿的传递和网际互连(包 PackeT)
传输层:提供端到端的可靠报文传递和错误恢复(段 Segment)
会话层:建立、管理和终止会话(会话协议数据单元 SPDU)
表示层:对数据进行翻译、加密和压缩(表示协议数据单元 PPDU)
应用层:允许访问 OSI 环境的手段(应用协议数据单元 APDU)
:ICMP 协议: 因特网控制报文协议。它是 TCP/IP 协议族的一个子协议,用于在 IP 主机、路由器之间传递控制消息。
TFTP 协议: 是 TCP/IP 协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。
HTTP 协议: 超文本传输协议,是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。
NAT 协议:网络地址转换属接入广域网 (WAN) 技术,是一种将私有(保留)地址转化为合法 IP 地址的转换技术,
DHCP 协议:动态主机配置协议,是一种让系统得以连接到网络上,并获取所需要的配置参数手段,使用 UDP 协议工作。具体用途:给内部网络或网络服务供应商自动分配 IP 地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段。
http://blog.csdn.net/nineteen_/article/details/50131981
A 类地址:以 0 开头, 第一个字节范围:1~127(1.0.0.0 - 127.255.255.255);
B 类地址:以 10 开头, 第一个字节范围:128~191(128.0.0.0 - 191.255.255.255);
C 类地址:以 110 开头, 第一个字节范围:192~223(192.0.0.0 - 223.255.255.255);
D 类地址:以 1110 开头,第一个字节范围:224~239(224.0.0.0 - 239.255.255.255);(作为多播使用)
E 类地址:保留
其中 A、B、C 是基本类,D、E 类作为多播和保留使用。
以下是留用的内部私有地址:
A 类 10.0.0.0--10.255.255.255
B 类 172.16.0.0--172.31.255.255
C 类 192.168.0.0--192.168.255.255
IP 地址与子网掩码相与得到网络号:
ip : 192.168.2.110
&
Submask : 255.255.255.0
----------------------------
网络号 :192.168.2 .0
注:
主机号,全为 0 的是网络号(例如:192.168.2.0),主机号全为 1 的为广播地址(192.168.2.255)
1:首先,每个主机都会在自己的 ARP 缓冲区中建立一个 ARP 列表,以表示 IP 地址和 MAC 地址之间的对应关系。
2:当源主机要发送数据时,首先检查 ARP 列表中是否有对应 IP 地址的目的主机的 MAC 地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送 ARP 数据包,该数据包包括的内容有:源主机 IP 地址,源主机 MAC 地址,目的主机的 IP 地址。
3:当本网络的所有主机收到该 ARP 数据包时,首先检查数据包中的 IP 地址是否是自己的 IP 地址,如果不是,则忽略该数据包,如果是,则首先从数据包中取出源主机的 IP 和 MAC 地址写入到 ARP 列表中,如果已经存在,则覆盖,然后将自己的 MAC 地址写入 ARP 响应包中,告诉源主机自己是它想要找的 MAC 地址。
4:源主机收到 ARP 响应包后。将目的主机的 IP 和 MAC 地址写入 ARP 列表,并利用此信息发送数据。如果源主机一直没有收到 ARP 响应数据包,表示 ARP 查询失败。
广播发送 ARP 请求,单播发送 ARP 响应。
RARP 是逆地址解析协议,作用是完成硬件地址到 IP 地址的映射,主要用于无盘工作站,因为给无盘工作站配置的 IP 地址不能保存。工作流程:在网络中配置一台 RARP 服务器,里面保存着 IP 地址和 MAC 地址的映射关系,当无盘工作站启动后,就封装一个 RARP 数据包,里面有其 MAC 地址,然后广播到网络上去,当服务器收到请求包后,就查找对应的 MAC 地址的 IP 地址装入响应报文中发回给请求者。因为需要广播请求报文,因此 RARP 只能用于具有广播能力的网络。
TCP 连接的 11 种状态
一条 TCP 连接在其生存期内会经历一系列状态。TCP 连接包含 11 个状态。分别是:LISTEN、SYN_SENT、SYN_RECEIVED、ESTABLISHED、FIN_WAIT_1、FIN_WAIT_2、CLOSE_WAIT、CLOSING、LAST_ACK、TIME_WAIT 以及最终状态 CLOSED。状态转换图如下所示:
TCP 状态迁移图
简单分析下状态含义以及转换的过程:
CLOSED :是一个虚拟的状态,它代表一条连接结束时的状态。
LISTEN :表示服务端正在等待来自 TCP 客户端的连接请求。服务端为此要调用 bind() 以及 listen() 函数。
SYN_SENT : 客户端发起连接,发送 SYN 给服务端后,进入此状态。
SYN_RECEIVED : 服务端接收到客户端的 SYN 请求,服务端由 LISTEN 状态进入 SYN_RECEIVED 状态,同时发送一个 ACK 和一个 SYN 给客户端。另一种情况 是客户端发送 SYN 的同时接收到服务器的 SYN 请求,客户端就会由 SYN_SENT 状态进入 SYN_RECEIVED 状态。
ESTABLISHED : 表示经过三次握手,连接已经建立,可以在两个方向上传输数据。这是一条连接在数据传输阶段的常见状态。
FIN_WAIT_1 : 主动关闭的一方发送 FIN,由 ESTABLISHED 状态进入 FIN_WAIT_1 状态。
FIN_WAIT_2 : 主动关闭的一方,接收到对方的 FIN ACK, 由 FIN_WAIT_1 状态,进入 FIN_WAIT_2 状态。
CLOSE_WAIT : 被动关闭的一方,在接收到 FIN 后,由 ESTABLISHED 状态进入此状态。
CLOSING : 这种状态表示此时双方刚好可能都在关闭连接,即客户端向服务器发送 FIN 报文,进入 FIN_WAIT_1 状态后,没有收到服务器发来的 ACK 报文,反而受到服务器发来的 FIN 报文,说明此时客户端和服务器同时发起关闭连接,随后,客户端进入 CLOSING 状态。
LAST_ACK : 被动关闭的一方,发起关闭请求,由 CLOSE_WAIT 状态,进入此状态。在接收到 ACK 后,会进入 CLOSED 状态。
TIME_WAIT : 有 3 个状态可以转化为 TIME_WAIT 状态。
由 FIN_WAIT_2 进入此状态:在双方不同时发起 FIN 的情况下,主动关闭的一方在完成自身发起的关闭请求后,接收到被动关闭一方的 FIN 后进入的状态。
由 CLOSING 状态进入: 双方同时发起关闭,都做了发起 FIN 的请求,同时接收到了 FIN 并做了 ACK 的情况下,由 CLOSING 状态进入。
由 FIN_WAIT_1 状态进入:同时接受到 FIN(对方发起),ACK(本身发起的 FIN 回应),与 2 的区别在于本身发起的 FIN 回应的 ACK 先于对方的 FIN 请求到达,而 2 是 FIN 先到达。这种情况概率最小。
CLOSED : 在超时或者连接关闭时候进入此状态。
关闭连接的三种方式
在结束一条连接的时候任一方都需要独立地关闭属于自己的一般连接。因此,TCP 的一端可能通过下列三种状态迁移方式,将连接从 ESTABLISHED 状态,转换到 CLOSED 状态。
一端先关闭:
ESTABLISHED -> FIN_WAIT_1 -> FIN_WAIT_2 -> TIME_WAIT -> CLOSED
另一端先关闭:
ESTABLISHED -> CLOSED_WAIT -> LAST_ACK -> CLOSED
两端同时关闭:
ESTABLISHED -> FIN_WAIT_1 -> CLOSING -> TIME_WAIT -> CLOSED
TIME_WAIT 状态分析
为什么关闭连接后,不直接进入 CLOSED 状态,而是先进入 TIME_WAIT 状态,再进入 CLOSED 状态呢?
当连接出于 TIME_WAIT 状态时,要等待 2MSL 的时间,才能迁移到 CLOSED 状态。
一种情况,因为 TCP 连接的本地端,需要发送一个 ACK 报文以确认另一端的 FIN 报文,然而它并不确定这个 ACK 报文是否已成功交付。另一端,如果没有收到 ACK 报文,就会重传 FIN 报文。在这种情况下,TIME_WAIT 状态的作用就是等待,以在有需要时重传 ACK。
假设目前连接的通信双方都已经调用了 close(),双方同时进入 CLOSED 的终结状态,而没有走 TIME_WAIT 状态。会出现如下问题,现在有一个新的连接被建立起来,使用的 IP 地址与端口与先前的完全相同,后建立的连接是原先连接的一个完全复用。还假定原先的连接中有数据报残存于网络之中,这样新的连接收到的数据报中有可能是先前连接的数据报。为了防止这一点,TCP 不允许新连接复用 TIME_WAIT 状态下的 socket。处于 TIME_WAIT 状态的 socket 在等待两倍的 MSL 时间以后,将会转变为 CLOSED 状态。这就意味着,一个成功建立的连接,必然使得先前网络中残余的数据报都丢失了。
MSL 就是 maximum segment lifetime(最大分节生命期),这是一个 IP 数据包能在互联网上生存的最长时间,超过这个时间 IP 数据包将在网络中消失 。MSL 在 RFC 1122 上建议是 2 分钟,而源自 berkeley 的 TCP 实现传统上使用 30 秒。
三次握手:
第一次握手:客户端发送 syn 包 (syn=x) 到服务器,并进入 SYN_SEND 状态,等待服务器确认;
第二次握手:服务器收到 syn 包,必须确认客户的 SYN(ack=x+1),同时自己也发送一个 SYN 包(syn=y),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态;
第三次握手:客户端收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK(ack=y+1),此包发送完毕,客户端和服务器进入 ESTABLISHED 状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP 连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。
四次挥手
与建立连接的 "三次握手" 类似,断开一个 TCP 连接则需要 "四次握手"。
第一次挥手:主动关闭方发送一个 FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不 会再给你发数据了 (当然,在 fin 包之前发送出去的数据,如果没有收到对应的 ack 确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可 以接受数据。
第二次挥手:被动关闭方收到 FIN 包后,发送一个 ACK 给对方,确认序号为收到序号 + 1(与 SYN 相同,一个 FIN 占用一个序号)。
第三次挥手:被动关闭方发送一个 FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。
第四次挥手:主动关闭方收到 FIN 后,发送一个 ACK 给被动关闭方,确认序号为收到序号 + 1,至此,完成四次挥手。
https://toutiao.io/posts/mkdapk
一分钟理解 TCP 重传
原创 2017-12-14 fireflyc 写程序的康德
为什么需要重传
任何信息在介质中传输可能丢失,这是由于传输介质的物理特性决定的,所以网络不可能被设计为 "可靠的"(不是由于考虑 "性能" 原因而是压根做不到)。既然物理层无法提供可靠数据传输那么只能由协议提供可靠传输了,其中最有名的协议就是 TCP 了。
TCP 是基于 IP 的网络协议,它提供可靠、有序的数据传输。在数据传输之前客户端和服务器端通过三次握手建立连接,建立连接的就是双方交换 Seq(数据包序号)、MSS(每个 TCP 数据包大小) 、Win(滑动窗口,一次可以确认多少个 TCP 数据包),连接建立完成后每个 TCP 数据包都要被 ACK(确认)。简单来说 TCP 通过确认 / 重传机制实现了 "数据包可靠传输"。
重传原理
TCP 数据包头部包含了两个字段——Seq 表示数据包序号,ACK 表示确认序号。下面演示了三次握手过程中 Seq 和 ACK 的变化过程。
客户端随机取一个值 x 作为 Seq 发送到服务器端;服务器端回复一个 TCP 数据包,头部包含 Seq(随机值 y),ACK=x+1。注意这里有一个常见的误区,ack 确认的是当前数据包的 "下一个" 数据包,ack 其实可以作为 "期望得到的下一个 seq"。客户端收到服务器端回复之后单独回复一个 ack=y+1,就完成 TCP 的握手了。
后续数据包传递都会延续 seq 和 ack 的值,如果发送端某个数据包丢失了那么接收端不会发送 ack(其实是 duplicate ack),发送端在等待一段时间后发现没有 ack,于是主动重发数据包。发送端的等待的时间叫 RTO(Retransmission TimeOut)。
RTO 的选择很重要,如果太大那么网络带宽利用率会特别低,发送端要过很久才知道要重传而此时要重传的数据是在太多严重浪费带宽资源。如果太小在高延时的网络高带宽(恩,你访问国外网站就属于这种网络)中也会浪费带宽资源。于是就有了 Fast Retransmit 机制,简单来说当发送端发现来自接收端的多个重复 ACK(duplicate ack)的时候就不再等待 RTO 而是直接选择重发。
总结一下:经典 TCP 重发是发送端主动重发的,当数据包经历了一段时间后还没有被接收端确认此时发送端主动重发数据包。Fast Retransmit 是由接收端主动要求重发的,当接收端收到了 "不想要" 的数据包时会重复 ACK"上一个" 数据包从而触发发送端的重发。这两种重发策略一般是同时使用,它们是互补的。
举个例子:发送端有 D1(1-10)、D2(11-20)、D3(21-30)、D4(31-40) 四个数据包要发送,每个数据包 10bytes 用括号内的数字表示。
乱序的情况:接收端收到 D1,发送 ack=11(D2 的序号)。如果在发送过程中 D4 在 D1 之后达由于 D4 携带的 seq=31 所以接收端会丢弃这个数据包然后再次发送 ack=11。此时发送端会收到两个 ack(duplicate ack)如果开启了 Fast Retransmit 特性那么发送端立即从 D2 开始重新发送。
丢包的情况:接收端收到 D1,发送 ack=11(D2 的序号)。如果在发送过程中 D2 丢失那么后续到达的包是 D3,由于 D3 携带的 seq=21 所以接收端会丢弃这个数据包然后再次发送 ack=11。此时发送端也会出现 duplicate ack 从而触发重传。
如果接收端的 ACK 数据包丢失了或者网络时延太高那么也会触发重传。因为发送端对每个数据包都设置了一个 RTO,如果到时间没有收到 ACK 它会 "主动" 重发数据包。
Q&A
Q:多线程对一个 Socket 写入是否会触发 TCP 重发?程序上是否要考虑 "乱序"?
A:首先要搞清楚一点,我们往 Socket 写入的数据是 "应用层数据包" 而不是 TCP 数据包。TCP/IP 协议栈会把应用层数据包划分出多个 TCP 数据包发送出去,每次 write 都会生成 N 个连续的 TCP 数据包。所以即便我们多线程往 Socket 写入也不会出现 TCP 数据包的乱序(应用层数据包可能是乱序的)。
Q:重传和拥塞控制有什么关系?
A:TCP 拥塞控制是指尽可能的利用带宽,它围绕 4 个核心概念展开:慢启动、拥塞避免和快速重传、快速恢复。其中快速重传、快速恢复属于 TCP 重传机制,慢启动是指对滑动窗口的控制,拥塞避免好重传机制有一定关系,如果存在大量重传那么网络上可能出现了拥塞(拥塞避免的关键是识别拥塞)。
Q:怎么看 "替代 TCP" 的说法?
A:TCP 最遭人诟病的就是它的重传机制不可控。如果网络延时比较高或者质量比较差有一定丢包(特别是移动网络),TCP 的重传机制触发 "不及时" 这就导致应用体验很差。比如一个 1000 帧的视频丢了第 100 帧那么后续的 900 帧都要重传(即便已经收到了)。当然这只是一个例子,视频还是可以做一定 "弥补" 的),如果是手机游戏(比如王者荣耀、荒野行动)情况就没有这么乐观了。为了尽可能的让 "重传" 可控于是诞生了各种 "替代 TCP" 的自制协议(大部分是基于 UDP),比如 Google 的 QUIC、kcp。我个人对这方面研究不多,总体而言它们牺牲了 TCP 的一些 "通用特性" 来换取一定的 "灵活性",所以并不是惊天地泣鬼神的 "替代 TCP"。
Q:怎么看 TCP 单边加速
A:TCP 单边加速是指针对通讯的某一端做性能加速,市面上有很多这种产品。但是个人觉得这些都是骗人的,并没有一种算法适合所有网络情况。要根据不同的网络情况配置不同的拥塞控制算法。比如 "国际链路" 属于高延时高带宽,配置了 Google 的 BBR 算法 "梯子" 的速度至少能提高 70-80%(你懂得)。
https://mp.weixin.qq.com/s/LX9S3A3i_7hDz39i-DYOBQ
1.IP 地址编址方法正确发展次序: ABC 分类地址 --> 子网划分 --> 无分类编址 CIDR
补充知识点: CIDR(无分类域间路由选择)
CIDR 最主要有两个以下特点:
地址掩码:是一连串的 1 和 0 组成,而 1 的个数救赎网络前缀长度。在斜线记法中。斜线后面的数字就是地址掩码中 1 的个数。
构成超网:将网络前缀缩短,网络前缀越短,其地址块所包含的地址数就越多。
CIDR 的好处:
在使用 CIDR 中,在查找路由表时可能会得到不止一个匹配结果,这时应当从匹配结构中选择具有最长网络前缀的路由,因为网络前缀越长,其地址块就越小,因而路由就越具体。
使用 CIDR 后查找最长前缀匹配,应使用二叉线索,即将无分类编址的路由表放在一层次的数据结构中,自上而下的按层次查找。操作时应先找出每一个 IP 地址的唯一前缀,唯一前缀就是在表中所有的 IP 地址中,该前缀是唯一的
CIDR 支持路由归纳,可以将多个地址块聚合在一起,将路由表中的许多路由条目合并为更小的数目,这样减少路由器中路由表的大小,减少路由通告的时间。
2. 下列关于 210.120.1.128/10 的地址块正确的是: 网络号为 210.64.0.0/10 广播地址是 210.127.255.255 最大 IP 是 210.127.255.254 一共有 2^22-2 个 ip 地址
3. 网络体系结构可以定义成
建立和使用通信硬件和软件的一套规则和规范
4. 关于传统的分类 IP 编址方法,正确的说法是
A 类、B 类、C 类地址都是单传播地址,它们的网络号字段分别是 1,2,和 3 字节长,而在网络号字段的最前面有 1~3 位的类别位,其数值分为规定为 0,10,110。
A 类地址的网络号字段占一个字节,只有 7 位可供使用,但可指派的网络号是 126 个。 128-2 全 0 全 1 都不要
D 类地址(前 4 位是 1110)用于多播,而 E 类地址(前 4 位为 1111)保留为以后用。
5. 以下关于网络体系结构的描述中
6. 网络协议主要要素为
语法、语义、同步
7. 与 10.110.12.29 mask 255.255.255.224 属于同一网段的主机 IP 地址是
10.110.12.30
来源: http://www.bubuko.com/infodetail-2432855.html