ISO的分层模型
七层OSI模型:
层 | 例如 |
---|---|
应用层 | HTTP、SMTP、SNMP、FTP、Telnet、SIP、SSH、NFS、RTSP、XMPP、Whois、ENRP、等等 |
表示层 | XDR、ASN.1、SMB、AFP、NCP、等等 |
会话层 | TCP、UDP、TLS、RTP、SCTP、SPX、ATP、IL、等等 |
传输层 | TCP、UDP、TLS、RTP、SCTP、SPX、ATP、IL、等等 |
网络层 | IP、ICMP、IGMP、IPX、BGP、OSPF、RIP、IGRP、EIGRP、ARP、RARP、X.25、等等 |
数据链路层 | 以太网、令牌环、HDLC、帧中继、ISDN、ATM、IEEE 802.11、FDDI、PPP、等等 |
物理层 | 例如铜缆、网线、光缆、无线电等等 |
TCP/IP协议是Internet互联网最基本的协议,其在一定程度上参考了七层ISO模型。
OSI模型共有七层,从下到上分别是物理层、数据链路层、网络层、运输层、会话层、表示层和应用层。
但是这显然是有些复杂的,所以在TCP/IP协议中,七层被简化为了四个层次。
TCP/IP模型中的各种协议,依其功能不同,被分别归属到这四层之中,常被视为是简化过后的七层OSI模型。
1、应用层:
程序在这一层,HTTP、SSH、FTP、DNS
2、表示层
充当应用程序和网络之间的翻译官,完成网络所需的格式和计算机的格式之间转换数据。
3、会话层
管理连接,建立同步
4、传输层(运输层)
为了保证两端能够顺利的通讯
UDP:无连接,不稳定,面向数据报
TCP:有连接,稳定、面向数据流
5、网络层
管理选择路由地址,IP协议
5个关键要素:目标IP、目标端口号、源地址IP、源端口号、协议
6、数据链路层
接收和解析相邻节点的数据的。
7、物理层
网线、基站、光信号、电信号。比特流和电子信号的切换。
数据传输过程:封装和分用
封装就是从应用层一步步到物理层的过程 (打包快递)
分用就说从物理层到应用层的过程 (拆快递)
TCP/IP协议与七层ISO模型的对应关系
TCP/IP协议与七层ISO模型的对应关系,大致如下图所示:
图:TCP/IP协议与七层ISO模型的对应关系
TCP/IP协议的应用层的主要协议有HTTP、Telnet、FTP、SMTP等,是用来读取来自传输层的数据或者将数据传输写入传输层;
传输层的主要协议有UDP、TCP,实现端对端的数据传输;
网络层的主要协议有ICMP、IP、IGMP,主要负责网络中数据包的传送等;
链路层有时也称作数据链路层或网络接口层,主要协议有ARP、RARP,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡,它们一起处理与传输媒介(如电缆或其他物理设备)的物理接口细节。
(一)TCP/IP协议的应用层
应用层包括所有和应用程序协同工作,并利用基础网络交换应用程序的业务数据的协议。一些特定的程序被认为运行在这个层上,该层协议所提供的服务能直接支持用户应用。应用层协议包括HTTP(万维网服务)、FTP(文件传输)、SMTP(电子邮件)、SSH(安全远程登陆)、DNS(域名解析)以及许多其他协议。
(二)TCP/IP协议的传输层
传输层的协议,解决了诸如端到端可靠性问题,能确保数据可靠的到达目的地,甚至能保证数据按照正确的顺序到达目的地。传输层的主要功能大致如下:
(1)为端到端连接提供传输服务;
(2)这种传输服务分为可靠和不可靠的,其中TCP是典型的可靠传输,而UDP则是不可靠传输;
(3)为端到端连接提供流量控制、差错控制、QoS(Quality of Service)服务质量等管理服务。
传输层主要有两个性质不同的协议:TCP传输控制协议 和 UDP用户数据报协议。
TCP协议是一个面向连接的、可靠的传输协议,它提供一种可靠的字节流,能保证数据完整、无损并且按顺序到达。TCP尽量连续不断地测试网络的负载并且控制发送数据的速度以避免网络过载。另外,TCP试图将数据按照规定的顺序发送。
UDP协议是一个无连接的数据报协议,是一个“尽力传递”和“不可靠”协议,不会对数据包是否已经到达目的地进行检查,并且不保证数据包按顺序到达。
总体来说,TCP协议传输效率低,但可靠性强;UDP协议传输效率高,但可靠性略低,适用于传输可靠性要求不高、体量小的数据(比如QQ聊天数据)。
(三)TCP/IP协议的网络层
TCP/IP协议网络层的作用是在复杂的网络环境中为要发送的数据报找到一个合适的路径进行传输。简单来说,网络层负责将数据传输到目标地址,目标地址可以是多个网络通过路由器连接而成的某一个地址。另外,网络层负责寻找合适的路径到达对方计算机,并把数据帧传送给对方,网络层还可以实现拥塞控制、网际互连等功能。网络层协议的代表包括:ICMP、IP、IGMP等。
(四)TCP/IP协议的链路层
链路层有时也称作数据链路层或网络接口层,用来处理连接网络的硬件部分。该层既包括操作系统硬件的设备驱动、NIC(网卡)、光纤等物理可见部分,还包括连接器等一切传输媒介。在这一层,数据的传输单位为比特。其主要协议有ARP、RARP等。
应用层协议
HTTP
-
http 是应用层协议,规定了浏览器怎么向万维网服务器请求万维网文档,以及服务器怎么把文档传送给浏览器,传输层协议适用面向连接的 TCP 协议,保证了传输的可靠性
- http 请求报文会作为 TCP 连接三次握手最后一次握手报文的数据发送给服务器
-
特点:
-
无状态:同一个用户多次访问同一个服务器上的资源时,服务器的响应是相同的,因为服务器不记得曾经访问过的用户
-
优点:无状态特性简化了服务器的设计,使服务器更容易支持大量并发的 HTTP请求
-
HTTP 1.0 和 HTTP 1.1 的区别
-
HTTP 1.0
- 每次请求都会建立新的 TCP 连接
-
HTTP 1.1
- 使用了保持连接,可以一次连接,多次传输,并且保持连接支持流水线工作方式,能够连续发送请求,这个时候客户访问的对象只需花费一个 RTT 时间(一个请求和响应的时间)
IP协议
协议头
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tM7yyoEh-1664379420960)(C:\Users\95233\AppData\Roaming\Typora\typora-user-images\image-20220608160637036.png)]
IP 地址的组成
-
一个 IP 地址再整个互联网范围内是唯一的
-
过去划分网络号和主机号的方案
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pBgkbSBA-1664379420961)(C:\Users\95233\AppData\Roaming\Typora\typora-user-images\image-20220608160718599.png)]
-
IP地址 = 网络号 + 主机号
-
1.网络号:标志主机(或路由器)所连接到的网络,也标志着不同的网段
-
2.主机号:标志着同一网段内不同的主机
-
-
当初这样的设计是考虑到有的网络拥有很多主机,而有的网络上主机很少,为了满足不同用户的需求
-
存在的问题:
-
1.IP 地址的浪费(利用率有时很低):A 类地址网络可连接主机数超过 1000w(2^24),并且占所有 IP 的一半
-
2.给每个物理网络分配一个网络号会使路由表变得太大,影响性能,增加了路由器的成本(需要更多的储存空间和查询性能)
-
3.两级 IP 地址不够灵活
-
子网掩码技术
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jTYC1PpF-1664379420961)(C:\Users\95233\AppData\Roaming\Typora\typora-user-images\image-20220608160833295.png)]
-
划分子网使 IP 地址变成三级结构,子网掩码与 IP 地址按位与可得到子网的网络地址
-
子网取值范围:
-
开始值:网络号。
-
结束值:255-子网掩码最后一部分的十进制的值+开始值。
-
-
在一定程度上缓解了IP地址不够用的问题(提高了利用率, 减少了浪费, 但是IP地址的绝对上限并没有增加), 仍然不是很够用
动态分配IP地址
只给接入网络的设备分配IP地址. 因此同一个MAC地址的设备, 每次接入互联网中, 得到的IP地址不一定是相同的;
网络地址转换技术(NAT)
-
网络地址转换技术主要用于实现位于内部网络的主机访问外部网络的功能。通过NAT技术可以将私网地址转换为公网地址,并且可以多个私网用户共用一个公网地址。节省了公网地址。
-
NAT 缺点
-
部署和运行NAT服务是需要硬件支持。
-
当NAT挂掉之后,整个局域网就瘫痪了。
-
无法从NAT外部向内部服务器建立连接。
-
网络地址与端口号转换技术(NAPT)
- 使用端口号的 NAT
代理服务器
代理服务器是一种特殊的网络服务,允许一个网络终端(一般为客户端)与另一个网络终端(一般为服务器)进行非直接的连接。一些网关,路由器具备网络代理功能。
-
客户端首先与代理服务器创建连接,接着根据代理服务器所使用的代理协议,请求对目标服务器创建连接、或者获得目标服务器的指定资源(如:文件)。
-
在后一种情况中,代理服务器可能对目标服务器的资源下载至本地缓存,如果客户端所要获取的资源在代理服务器的缓存之中,则代理服务器并不会向目标服务器发送请求,而是直接返回缓存了的资源。
-
一些代理协议允许代理服务器改变客户端的原始请求、目标服务器的原始响应,以满足代理协议的需要。
NAT技术和代理服务器的区别?
1.所在层级不同:NAT是网络层的,代理是应用层。
2.应用场景:NAT是解决IP不足问题,代理是解决不能到达的问题。
3.部署方式:NAT通常会部署在防火墙,代理是一个软件,直接安装就可以使用了。
为了减少IP地址的浪费,人们使用了子网掩码、网络地址转换(NAT)等技术。为了扩大地址空间,拟通过新的IP协议IPv6重新定义地址空间。IPv6是下一代互联网协议,采用128位地址长度,几乎可以不受限制地提供地址,目前IPv6正在逐步取代IPv4
传输层协议
UDP
1、特点
-
无连接,传输数据时不需要建立链接
-
尽最大努力传输, 不可靠
-
面向报文
- 接收到应用程序的数据时,只往数据前面加一个 UDP 头部就传给网络层,收到网络层传来的 UDP数据时,只把UDP头部去掉就扔给应用层进程。不论数据大小都是一次发送。若,报文太长,交给 IP 层在传输时会分片,降低 IP 层效率,并且不安全;若太短,交给 IP 层后再加上 IP 数据报的头部,会使首部相对长度太大,这也降低了 IP 层的效率,所以应用层必须选择合适大小的报文
-
没有拥塞控制,不管链路的畅通情况,都以不变的速率发送报文。
-
UDP支持一对一,一对多,多对一,多对多的交互通信
-
UDP的头部简单,占用资源少(8字节)
2、首部
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0JO3R2Tb-1664379420962)(C:\Users\95233\AppData\Roaming\Typora\typora-user-images\image-20220608161404987.png)]
校验和由首部和数据按位运算并求反码得出,是为了验证传输是否出错的
3、一个 UDP 包大小
-
16位UDP长度 = UDP头部长度(8个字节) + 数据长度
-
UDP 一个包最大理论长度 = 2^16 = 65535/1024 = 64KB
-
如果UDP编程的时候的数据大小大于64 KB会怎样?
- 1.在应用层进行数据包的拆分和组合。
- 2.大于64 KB不处理,交给TCP/IP协议去处理,它会在网络层进行分包和组包(不用),因为,效率低并且质量不保证,如果分包后丢任意一个包,其他包全部会舍弃掉
4、适用场景
- 因为 UDP 无连接、只尽最大努力交付,首部设计简单、支持 一对多、多对多、多对一的交互通信、没有拥塞控制,所以适用于很多实时应用(如:IP 电话,视屏会议),要求以恒定速率发送数据,允许网络拥塞时部分数据的丢失,但是不允许数据有太大的时延
TCP
1、特点
-
面向连接
- 应用层建立适用 TCP 协议之前,必须建立连接,传输数据完毕后,释放连接
-
可靠交付
-
点对点
- 一个 TCP 连接只能有两个端点
-
面向字节流
- 虽然交互的是一次一个的数据库,但是 TCP 把应用程序交付下来的数据仅仅看成的一连串的无结构字节流,发送的数据块和接受的数据块没有具体对应的大小关系相比于 UDP ,TCP 不关心应用程序数据块的大小,当作字节流处理,放入自己的接受缓冲区,根据对方给出的窗口值和当前网络的拥塞程度来决定一个报文应包含多少字节。如果应用程序的数据块太长,TCP可以划分短一点再传输,如果太短,可以等待积累到足够多的字节再构成报文段发送出去
-
全双工
- 拥有都有发送缓冲区和接受缓冲区,允许应用程序任何时间发送数据
2、首部
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kshlSioT-1664379420963)(C:\Users\95233\AppData\Roaming\Typora\typora-user-images\image-20220608161828858.png)]
-
首部固定 20 个字节
-
序号(seq) /确认序号(ack) = N 表示:到序号 N - 1 为止的所有数据都已正确收到
-
窗口:已发送并且确认收到才会交付给主机,保证交付的时候消息的连续性,是缓冲区的一部分
-
16位数字最大表示65535, 那么TCP窗口最大就是 65535字节么?
- TCP首部40字节选项中还包含了一个窗口扩大因子M, 实际窗口大小是 窗口字段的值左移 M 位;
3、八大特性
①、确认应答
-
收到一条报文后,向发送端发送一条确认 ACK,此ACK的作用就是告诉发送端:接收端已经成功的收到了消息,并且通过序号告诉发送端希望收到下一条报文的序列号是什么
-
作用
-
来确认接收端收到数据了
-
可以知道收到的是哪一条数据
-
②、超时重传
-
一段时间后还未收到 ACK,会重发消息
-
发送频率不会以固定的频率发送,悲观策略,如果第一次发送失败了,第二次大概率也肯能会发送失败,所以 TCP 会以 500ms 为单位 指数级超时时间增长的频率来发送频率
-
累积到一定次数后,TCP会认为网络或对端主机出现异常,强制关闭链接
-
-
原因:ACK 丢了或消息丢了,如果是消息丢了重传,接收端会自动去重,从新回复 ACK
③、链接管理
-
三次握手[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CmJxgWAh-1664379420963)(C:\Users\95233\AppData\Roaming\Typora\typora-user-images\image-20220608162156638.png)]
-
A端(客户端)和 B端(服务器端)都处于 CLOSED 状态
-
A 主动打开连接,发送连接请求报文(首部中的同步位 SYN = 1,同时选择一个初始序号 seq = x),A 端状态变为 SYN_SENT (同步已发送)状态,B 端被动打开连接,状态变为 LISTEN (收听)
-
B 端收到后,向 A 发送确认报文(首部中 SYN = 1,ACK = 1,序号 seq= y,确认号 ack = x + 1),B 端状态变为 SYN_RCVD(同步已收到)
-
A 端收到 B 的确认报文,回复一条确认报文(首部 ACK = 1,序号 seq= x + 1,确认号 ack = y + 1),A 端状态变为 ESTABLISHED(已建立连接)
-
B 端收到后也将状态置为 ESTABLISHED
-
-
四次挥手(FIN:连接释放报文段标志位)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vi61X56K-1664379420964)(C:\Users\95233\AppData\Roaming\Typora\typora-user-images\image-20220608162226036.png)]
④、滑动窗口
-
停止等待协议信道利用率太低,滑动窗口相当于流水线操作,发送方可以连续发送多个分组,不必每发完一个分组就停下来等待
-
作用
-
利用滑动窗口可以实现流量控制
-
保证性能,提高吞吐量
-
-
异常处理
-
主要问题是怎么处理 ACK 或者消息丢失的情况
- 头部的确认序号
-
ACK 丢了
-
不影响,因为确认序号表示 …
-
消息丢了
-
接受方进行三次重复确认应答(确认序列号为连续消息的最大序号)
-
发送方收到 3 个同样的确认应答则进行重发,这样可以尽早知道个别报文段的丢失,这样就不会出现超时,发送方也就不会误以为出现了网络拥塞,可以使整个网络的吞吐量提高约 20%
-
-
⑤、流量控制
-
因为接收端缓冲区满后,如果发送端继续发送,造成丢包,继而引起重传等一系列连锁反应。所以接收端将自己的接受能力反馈到发送端,根据接收端的处理能力, 来决定发送端的发送速度。
-
死锁问题:如果接收端窗口值为 0,发送端就会暂停发送,两端都陷入互相等待的死锁局面
-
TCP 会以固定的频率发送一个检测包,检测接收端缓存区的剩余大小
⑥、拥塞控制
-
少量的丢包, 我们仅仅是触发超时重传; 大量的丢包, 就认为网络拥塞。当TCP通信开始后, 网络吞吐量会逐渐上升; 随着网络发生拥堵, 吞吐量会立刻下降;
- 拥塞控制, 归根结底是 TCP 协议想尽可能快的把数据传输给对方, 但是又要避免给网络造成太大压力的折中方案.
-
慢启动
-
刚开始初始发送1个包,如果可以正常接收就会以指数型增加发送的数据包数量,一直增加到流量控制的最大值之后,就会从指数增长变成线性增长,一直进行收发,直到出现大量数据包丢失的时候:
-
将发送的数量修改成 1;
-
将流量控制的最大值设置成当前丢包的值/2。继续进行发包,一直循环此过成功。整个过程就叫做 “慢开始”
-
-
⑦、延迟应答
-
如果接收数据的主机立刻返回ACK应答, 这时候返回的窗口可能比较小
-
假设接收端缓冲区为1M. 一次收到了500K的数据; 如果立刻应答, 返回的窗口就是500K;
-
但实际上可能处理端处理的速度很快,10ms之内就把500K数据从缓冲区消费掉了;
-
在这种情况下, 接收端处理还远没有达到自己的极限, 即使窗口再放大一些,也能处理过来;
-
如果接收端稍微等一会再应答, 比如等待200ms再应答, 那么这个时候返回的窗口大小就是 1M;
-
-
窗口越大, 网络吞吐量就越大, 传输效率就越高. 我们的目标是在保证网络不拥塞的情况下尽量提高传输效率;
-
时间限制:每隔一段时间(固定时间)延时应答一次
-
数量限制::每隔N次,延迟应答一次
-
⑧、捎带应答
- 是针对于延迟应答的性能提升,因为客户端服务器在应用层也是 “一发一收”,这就意味着 ACK就可以搭顺风车, 和服务器的回应 一 起回给客户端
UDP和TCP的区别:
-
UDP 是无连接,而 TCP 是有连接;
-
UDP 是不稳定的,而 TCP 是稳定的;
-
UDP是面向数据包,而TCP是面向数据流;
-
UDP是有接收缓冲区的,没有发送缓冲区;而TCP既有发送缓冲区也有接收缓冲区
数据链路层
MAC 地址(硬件地址/物理地址)
-
在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址).
-
用来识别数据链路层中相连的节点;
-
长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19)
地址解析协议 ARP
ARP是一个介于数据链路层和网络层之间的协议;
网络层使用的是 IP 地址,但是在实际网络链路上传送数据帧时,最终必须使用网络硬件地址;
ARP协 议建立了主机 IP地址 和 MAC地址 的映射关系
RARP:逆地址解析协议
MTU
MTU相当于发快递时对包裹尺寸的限制. 这个限制是不同的数据链路对应的物理层,
产生的限制:
-
以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字 节,要在后 面补填充位;
-
最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU;
-
如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据 包进行分片(fragmentation);
-
不同的数据链路层标准的MTU是不同的;
问题:
三次握手过程
TCP连接的建立时,双方需要经过三次握手,具体过程如下:
(1)第一次握手:Client进入SYN_SENT状态,发送一个SYN帧来主动打开传输通道,该帧的SYN标志位被设置为1,同时会带上Client分配好的SN序列号,该SN是根据时间产生的一个随机值,通常情况下每间隔4ms会加1。除此之外,SYN帧还会带一个MSS(最大报文段长度)可选项的值,表示客户端发送出去的最大数据块的长度。
(2)第二次握手:Server端在收到SYN帧之后,会进入SYN_RCVD状态,同时返回SYN+ACK帧给Client,主要目的在于通知Client,Server端已经收到SYN消息,现在需要进行确认。Server端发出的SYN+ACK帧的ACK标志位被设置为1,其确认序号AN(Acknowledgment
Number)值被设置为Client的SN+1;SYN+ACK帧的SYN标志位被设置为1,SN值为Server端生成的SN序号;SYN+ACK帧的MSS(最大报文段长度)表示的是Server端的最大数据块长度。
(3)第三次握手:Client在收到Server的第二次握手SYN+ACK确认帧之后,首先将自己的状态会从SYN_SENT变成ESTABLISHED,表示自己方向的连接通道已经建立成功,Client可以发送数据给Server端了。然后,Client发ACK帧给Server端,该ACK帧的ACK标志位被设置为1,其确认序号AN(Acknowledgment
Number)值被设置为Server端的SN序列号+1。还有一种情况,Client可能会将ACK帧和第一帧要发送的数据,合并到一起发送给Server端。
(4)Server端在收到Client的ACK帧之后,会从SYN_RCVD状态会进入ESTABLISHED状态,至此,Server方向的通道连接建立成功,Server可以发送数据给Client,TCP的全双工连接建立完成。
三次握手的图解
Client和Server完成了三次握手后,双方就进入了数据传输的阶段。数据传输完成后,连接将断开,连接断开的过程需要经历四次挥手。
TCP的四次挥手
业务数据通信完成之后,TCP连接开始断开(或者拆接)的过程,在这个过程中连接的每个端的都能独立地、主动的发起,断开的过程TCP协议使用了四路挥手操作。
四次挥手具体过程
四次挥手具体过程,具体如下:
(1)第一次挥手:主动断开方(可以是客户端,也可以是服务器端),向对方发送一个FIN结束请求报文,此报文的FIN位被设置为1,并且正确设置Sequence
Number(序列号)和Acknowledgment
Number(确认号)。发送完成后,主动断开方进入FIN_WAIT_1状态,这表示主动断开方没有业务数据要发送给对方,准备关闭SOCKET连接了。
(2)第二次挥手:正常情况下,在收到了主动断开方发送的FIN断开请求报文后,被动断开方会发送一个ACK响应报文,报文的Acknowledgment
Number(确认号)值为断开请求报文的Sequence Number
(序列号)加1,该ACK确认报文的含义是:“我同意你的连接断开请求”。之后,被动断开方就进入了CLOSE-WAIT(关闭等待)状态,TCP协议服务会通知高层的应用进程,对方向本地方向的连接已经关闭,对方已经没有数据要发送了,若本地还要发送数据给对方,对方依然会接受。被动断开方的CLOSE-WAIT(关闭等待)还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
主动断开方在收到了ACK报文后,由FIN_WAIT_1转换成FIN_WAIT_2状态。
(3)第三次挥手:在发送完成ACK报文后,被动断开方还可以继续完成业务数据的发送,待剩余数据发送完成后,或者CLOSE-WAIT(关闭等待)截止后,被动断开方会向主动断开方发送一个FIN+ACK结束响应报文,表示被动断开方的数据都发送完了,然后,被动断开方进入LAST_ACK状态。
(4)第四次挥手:主动断开方收在到FIN+ACK断开响应报文后,还需要进行最后的确认,向被动断开方发送一个ACK确认报文,然后,自己就进入TIME_WAIT状态,等待超时后最终关闭连接。处于TIME_WAIT状态的主动断开方,在等待完成2MSL的时间后,如果期间没有收到其他报文,则证明对方已正常关闭,主动断开方的连接最终关闭。
被动断开方在收到主动断开方的最后的ACK报文以后,最终关闭了连接,自己啥也不管了。
四次挥手图解
处于TIME_WAIT状态的主动断开方,在等待完成2MSL的时间后,才真正关闭连接通道,其等待的时间为什么是2MSL呢?
2MSL翻译过来就是两倍的MSL。MSL全称为Maximum Segment
Lifetime,指的是一个TCP报文片段在网络中最大的存活时间,具体来说,2MSL对应于一次消息的来回(一个发送和一个回复)所需的最大时间。如果直到2MSL,主动断开方都没有再一次收到对方的报文(如FIN报文),则可以推断ACK已经被对方成功接收,此时,主动断开方将最终结束自己的TCP连接。所以,TCP的TIME_WAIT状态也称为2MSL等待状态。
有关MSL的具体的时间长度,在RFC1122协议中推荐为2分钟。在SICS(瑞典计算机科学院)开发的一个小型开源的TCP/IP协议栈——LwIP开源协议栈中MSL默认为1分钟。在源自Berkeley的TCP协议栈实现中MSL默认长度为30秒。总体来说,TIME_WAIT(2MSL)等待状态的时间长度,一般维持在1-4分钟之间。
通过三次握手建立连接和四次挥手拆除连接,一次TCP的连接建立及拆除,至少进行7次通信,可见其成本是很高的。
三次握手、四次挥手的常见面试题
有关TCP的连接建立的三次握手及拆除过程的四次挥手的面试问题,是技术面试过程中的出现频率很高的重点和难点问题,常见问题大致如下:
为什么关闭连接的需要四次挥手,而建立连接却只要三次握手呢?
关闭连接时,被动断开方在收到对方的FIN结束请求报文时,很可能业务数据没有发送完成,并不能立即关闭连接,被动方只能先回复一个ACK响应报文,告诉主动断开方:“你发的FIN报文我收到了,只有等到我所有的业务报文都发送完了,我才能真正的结束,在结束之前,我会发你FIN+ACK报文的,你先等着”。所以,被动断开方的确认报文,需要拆开成为两步,故总体就需要四步挥手。
而在建立连接场景中,Server端的应答可以稍微简单一些。当Server端收到Client端的SYN连接请求报文后,其中ACK报文表示对请求报文的应答,SYN报文用来表示服务端的连接也已经同步开启了,而ACK报文和SYN报文之间,不会有其他报文需要发送,故而可以合二为一,可以直接发送一个SYN+ACK报文。所以,在建立连接时,只需要三次握手即可。
为什么连接建立的时候是三次握手,可以改成两次握手吗?
三次握手完成两个重要的功能:一是双方都做好发送数据的准备工作,而且双方都知道对方已准备好;二是双方完成初始SN序列号的协商,双方的SN序列号在握手过程中被发送和确认。
如果把三次握手改成两次握手,可能发生死锁。两次握手的话,缺失了Client的二次确认ACK帧,假想的TCP建立的连接时二次挥手,可以如下图所示:
在假想的TCP建立的连接时二次握手过程中,Client发送Server发送一个SYN请求帧,Server收到后发送了确认应答SYN+ACK帧。按照两次握手的协定,Server认为连接已经成功地建立了,可以开始发送数据帧。这个过程中,如果确认应答SYN+ACK帧在传输中被丢失,Client没有收到,Client将不知道Server是否已准备好,也不知道Server的SN序列号,Client认为连接还未建立成功,将忽略Server发来的任何数据分组,会一直等待Server的SYN+ACK确认应答帧。而Server在发出的数据帧后,一直没有收到对应的ACK确认后就会产生超时,重复发送同样的数据帧。这样就形成了死锁。
为什么主动断开方在TIME-WAIT状态必须等待2MSL的时间?
原因之一:主动断开方等待2MSL的时间,是为了确保两端都能最终关闭。假设网络是不可靠的,被动断开方发送FIN+ACK报文后,其主动方的ACK响应报文有可能丢失,这时候的被动断开方处于LAST-ACK状态的,由于收不到ACK确认被动方一直不能正常的进入CLOSED状态。在这种场景下,被动断开方会超时重传FIN+ACK断开响应报文,如果主动断开方在2MSL时间内,收到这个重传的FIN+ACK报文,会重传一次ACK报文,后再一次重新启动2MSL计时等待,这样,就能确保被动断开方能收到ACK报文,从而能确保被动方顺利进入到CLOSED状态。只有这样,双方都能够确保关闭。反过来说,如果主动断开方在发送完ACK响应报文后,不是进入TIME_WAIT状态去等待2MSL时间,而是立即释放连接,则将无法收到被动方重传的FIN+ACK报文,所以不会再发送一次ACK确认报文,此时处于LAST-ACK状态的被动断开方,无法正常进入到CLOSED状态。
原因之二:防止“旧连接的已失效的数据报文”出现在新连接中。主动断开方在发送完最后一个ACK报文后,再经过2MSL,才能最终关闭和释放端口,这就意味着,相同端口的新TCP新连接,需要在2MSL的时间之后,才能够正常的建立。2MSL这段时间内,旧连接所产生的所有数据报文,都已经从网络中消失了,从而,确保了下一个新的连接中不会出现这种旧连接请求报文。
如果已经建立了连接,但是Client端突然出现故障了怎么办?
TCP还设有一个保活计时器,Client端如果出现故障,Server端不能一直等下去,这样会浪费系统资源。每收到一次Client客户端的数据帧后,Server端都的保活计时器会复位。计时器的超时时间通常是设置为2小时,若2小时还没有收到Client端的任何数据帧,Server端就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,Server端就认为Client端出了故障,接着就关闭连接。如果觉得保活计时器的两个多小时的间隔太长,可以自行调整TCP连接的保活参数。
为什么要三次握手?
-
证明客户端和服务端的收发能力的
-
同步收发序列号
TIME_WEIT 会等待2个MSL(最大超时时间)?
-
防止最后一条 ACK 没有收到,客户端自己关闭连接了,而服务器端无法关闭连接。
-
2MSL = ACK(最大超时时间 1MSL)+ FIN(对方发给他消息的一个最大等待时间 1MSL)
如果发现服务器存在大量的 CLOSE_WAIT 说明什么?
- 程序有BUG, 程序中没有调用 close() 主动关闭连接
对称加密与非对称加密
一、面临的问题: 密钥分发
在加密算法之外,面临一个问题,那就是:秘钥的分发。就是说,解密方如何获得加密方的秘钥呢? 从而出现了:对称加密和非对称加密。
二、对称加密和非对称加密
- 对称加密
对称加密指的就是加密和解密使用同一个秘钥,所以叫做对称加密。对称加密只有一个秘钥,作为私钥。
常见的对称加密算法:DES,AES,3DES等等。
非对称加密指的是:加密和解密使用不同的秘钥,一把作为公开的公钥,另一把作为私钥。公钥加密的信息,只有私钥才能解密。私钥加密的信息,只有公钥才能解密。
常见的非对称加密算法:RSA,ECC
- 区别
对称加密算法相比非对称加密算法来说,加解密的效率要高得多。但是缺陷在于对于秘钥的管理上,以及在非安全信道中通讯时,密钥交换的安全性不能保障。所以在实际的网络环境中,会将两者混合使用.
例如针对C/S模型,
-
服务端计算出一对秘钥pub/pri。将私钥保密,将公钥公开。
-
客户端请求服务端时,拿到服务端的公钥pub。
-
客户端通过AES计算出一个对称加密的秘钥X。 然后使用pub将X进行加密。
-
客户端将加密后的密文发送给服务端。服务端通过pri解密获得X。
-
然后两边的通讯内容就通过对称密钥X以对称加密算法来加解密。
对称加密和非对称加密的区别
1对称加密:加密解密用同一个密钥,被黑客拦截不安全
2非对称加密:公钥加密,私钥解密;公钥可以公开给别人进行加密,私钥永远在自己手里,非常安全,黑客拦截也没用,因为私钥未公开。著名的RSA加密算法用的就是非对称加密。
第一步:ipB先给A发送B公钥,ipA用B公钥加密A公钥发送给ipB,ipB拿到后,用B私钥去取里面内容,ipB拿到A公钥。
第二步:双方通信用对方公钥直接加密后发送。接收方用自己的私钥去解密。
举例子理解:
最简单易懂的非对称加密
北京的张三发了一个快递到广州的李四,途中经过了上海,上海快递中心出现了一个黑客老王,他偷偷打开了张三给李四的快递,然后偷偷把里边的衣服剪烂,再按照原样包装好发往广州,可以看到对于这样简单包装的传输在中途是可以偷偷修改里边的东西。
HTTP的数据包是明文传输,也即是如果中途某个黑客嗅探到这个HTTP包,他可以偷偷修改里边包的内容,至于张三跟李四是互相不知道这个动作的,因此我们必须要有一个方案来防止这种不安全的篡改行为,有个方法就是加密!
非对称加密
张三将衣服放到一个保险箱里边锁起来,他打了个电话告诉李四保险箱开柜密码是1234,而黑客老王不知道密码,所以他看不到保险箱里边的东西,李四收到快递后用预先沟通好的密码就可以打开保险箱了。
这里保护的手段就是张三对物品进行加密,同时给了告诉李四解密的方法!
那如果现在要求张三的密码只能通过快递传给李四呢?如果张三直接传密码给李四,老王如果嗅探到这个快递,那老王也知道密码了,这就无法保护快递的安全性了。因此还需要有个方案,让张三能够告诉李四密码的同时,老王又无法查看到张三跟李四通信的数据。
非对称加密在这个时候就发挥作用了,来看看怎么回事:
张三拥有两把钥匙,一把叫做公钥,一把叫做私钥。公钥是公开让全社会都知道,没关系,张三告诉所有人,你们要传递数据给我的时候请先用这个密钥(公钥)去加密一下你们的数据,加密后的数据只能通过张三私自藏着的私钥才能解密。
回到刚刚例子,
张三先发给保险柜(张三公钥)给李四,
接着李四把自己的保险柜(李四公钥)放到张三的保险柜(即使用张三的公钥加密李四的公钥)里边发还给张三,
接着张三拿到李四的数据包后,用自己的私钥解开了外层保险柜(张三的公钥),拿到了里边李四保险柜(李四的公钥)。
此时李四跟张三都有了各自的公钥(并且都有他们自己的私钥),接着只要保证每次互相传递数据的时候,把数据放在对方的保险柜里边即可(即每次都用对方的公钥加密数据),这样无论如何,老王都无法解开保险柜(因为只有各自的私钥才能解开各自的保险柜)。