网络必须知道的那点事

一 OSI七层模型
在这里插入图片描述

  • 应用层 :
    最靠近用户的一层,为计算机用户提供应用接口,直接为用户提供各种网络服务。常见的网络服务协议有:http,https,ftp,smtp等协议
  • 表示层:
    表示层提供各种用于应用层数据的编码和转换功能,确保一个系统应用层发送的数据能被另一个系统的应用层识别。比如数据压缩和加密。
  • 会话层:
    会话层就是负责建立,管理,终止表示层实体之间的通信会话。该层的通信由不同设备中的应用程序之间的服务请求和响应组成。
  • 传输层:
    传输层建立了主机端到端的链接,传输层作用是为上层协议提供端到端的可靠和透明的数据传输服务,包括处理差错控制和流量控制等问题。使高层用户看起来在两个主机之间有一条可靠的数据通路。
    tcp和udp在这一层。
  • 网络层:
    通过Ip寻址来建立两个节点之间的连接,为源端的运输层送来的分组,选择合适的路由和交换节点,然后传输给目的端的运输层。通常说的Ip层就是网络层
  • 数据链路层:
    将比特组合成字节,再将字节组合成帧,使用链路层地址来访问介质,并进行差错检测。
  • 物理层:
    提供传输介质。

二 TCP/IP五层模型

  • 应用层:
    把ISO七层中的应用层,表示层,会话层合并为一层应用层。
    协议有:http,https,ftp,dns,smtp
  • 传输层:
    协议:tcp,udp
  • 网络层:
    协议:Ip,ICMP,Rip,IGMP
  • 数据链路层:
    协议有:ARP.RARP,PPP,CSMA/CD
  • 物理层:

在这里插入图片描述

http和https

Http:
超文本传输协议,提供了发布和接收html页面的方法。http协议以明文方式发送信息,是不安全的。

Https:
是以安全为通道的Http通道,是http的安全版。http的安全基础是ssl,ssl协议位于Tcp/Ip协议与各种应用层协议之间,为数据通讯提供了支持。
ssl协议可分为两层:SSL记录协议,SSL握手协议。
ssl记录协议,建立在可靠传输协议如tcp之上,为高层协议提供数据封装,加密,压缩等功能。
ssl握手协议,建立在ssl记录协议之上,用于实际的数据传输开始前,通讯双方进行身份认证,协商加密算法,交换密钥。

区别:

  • https需要CA证书,需要一定费用
  • http是超文本传输协议,信息时明文传输,而https是具有安全性的ssl加密传输协议。
  • http和http使用的是完全不同的连接方式,用的端口不一样,http是80,https是443
  • http的连接很简单,是无状态的。https协议是由SSL+HTTP协议构建的具有加密传输,身份认证的网络协议,比http安全。

https的不足:

  • 握手阶段比较费时,会使页面的加载时间延长
  • https连接缓存不如http高效,会增加数据开销
  • SSL证书需要绑定IP,不能在同一个Ip绑定多个域名。
  • https协议的加密范围有限。

四 TCP和UDP

  • UDP
    包头:除了端口号以外啥都没有
    在这里插入图片描述
    特点:
    不需要大量数据结构,处理逻辑和包头字段
    不会建立连接,谁都可以给他传数据,他也可以给任何人发数据
    没有拥塞控制也不管会不会丢包

适用情况:
需要资源少,网络情况稳定的内网,或者丢包不敏感的应用
不需要一对一沟通,建立连接,而是可以广播的应用
需要处理速度快,可以容忍丢包的时候
如直播,实时游戏,物联网

  • TCP
    包头:

在这里插入图片描述
源端口和目的端口必不可少
序号,是为了解决乱序问题,知道哪个先发哪个后发
确认序号,发出去的包应该有确认,这样才知道对方是否收到,如果没收到就应该重新发送,解决丢包
状态位,SYN是发起连接,ACK是回复,RST是重连,FIN是结束连接,TCP是面向连接的,所以需要双方维护状态。
窗口大小,TCP根据窗口的大小来决定传输数据的多少,从而实现流量控制。

  • TCP的三次握手: 建立连接和沟通Tcp包的序号问题,其中seq就是A,B各自发起包的初始序号,ack是确认号,下一次期望收到的序号

三次握手可以理解为:
A:我是A
B : 你好A,我是B
A:你好B
在这里插入图片描述

这是网上经常见到的一张图,刚开始的时候,客户端和服务器都处于 CLOSED 状态,先是服务端主动监听某个端口,处于 LISTEN 状态。然后客户端主动发起连接 SYN,之后处于 SYN-SENT 状态。服务端接收了发起的连接,返回 SYN,并且 ACK ( 确认 ) 客户端的 SYN,之后处于 SYN-SENT 状态。客户端接收到服务端发送的 SYN 和 ACK 之后,发送 ACK 的 ACK,之后就处于 ESTAVLISHED 状态,因为它一发一收成功了。服务端收到 ACK 的 ACK 之后,也处于 ESTABLISHED 状态,因为它也一发一收了。

  • TCP四次挥手:当断开连接tcp有四次挥手

A:B 啊,我不想玩了
B:哦,你不想玩了啊,我知道了
这个时候,只是 A 不想玩了,即不再发送数据,但是 B 可能还有未发送完的数据,所以需要等待 B 也主动关闭。
B:A 啊,好吧,我也不玩了,拜拜
A:好的,拜拜
在这里插入图片描述
断开的时候,当 A 说不玩了,就进入 FIN_WAIT_1 的状态,B 收到 A 不玩了的消息后,进入 CLOSE_WAIT 的状态。

A 收到 B 说知道了,就进入 FIN_WAIT_2 的状态,如果 B 直接跑路,则 A 永远处与这个状态。TCP 协议里面并没有对这个状态的处理,但 Linux 有,可以调整 tcp_fin_timeout 这个参数,设置一个超时时间。

如果 B 没有跑路,A 接收到 B 的不玩了请求之后,从 FIN_WAIT_2 状态结束,按说 A 可以跑路了,但是如果 B 没有接收到 A 跑路的 ACK 呢,就再也接收不到了,所以这时候 A 需要等待一段时间,因为如果 B 没接收到 A 的 ACK 的话会重新发送给 A,所以 A 的等待时间需要足够长。

  • 累计应答:

首先为了保证顺序性,每个包都有一个 ID。在建立连接的时候会商定起始 ID 是什么,然后按照 ID 一个个发送,为了保证不丢包,需要对发送的包都要进行应答,当然,这个应答不是一个一个来的,而是会应答某个之前的 ID,表示都收到了,这种模式成为累计应答或累计确认。

为了记录所有发送的包和接收的包,TCP 需要发送端和接收端分别来缓存这些记录,发送端的缓存里是按照包的 ID 一个个排列,根据处理的情况分成四个部分

发送并且确认的
发送尚未确认的
没有发送等待发送的
没有发送并且暂时不会发送的
这里的第三部分和第四部分就属于流量控制的内容

在 TCP 里,接收端会给发送端报一个窗口大小,叫 Advertised window。这个窗口应该等于上面的第二部分加上第三部分,超过这个窗口,接收端做不过来,就不能发送了

于是,发送端要保持下面的数据结构
在这里插入图片描述
对于接收端来讲,它的缓存里面的内容要简单一些

接收并且确认过的
还没接收,但是马上就能接收的
还没接收,但也无法接收的

对应的数据结构如下
在这里插入图片描述

  • 顺序问题和丢包问题
    结合上面的图看,在发送端,1、2、3 已发送并确认;4、5、6、7、8、9 都是发送了还没确认;10、11、12 是还没发出的;13、14、15 是接收方没有空间,不准备发的。

在接收端来看,1、2、3、4、5 是已经完成 ACK 但是还没读取的;6、7 是等待接收的;8、9 是已经接收还没有 ACK 的。

发送端和接收端当前的状态如下:

1、2、3 没有问题,双方达成了一致
4、5 接收方说 ACK 了,但是发送方还没收到
6、7、8、9 肯定都发了,但是 8、9 已经到了,6、7 没到,出现了乱序,缓存着但是没办法 ACK。
根据这个例子可以知道顺序问题和丢包问题都有可能存在,所以我们先来看确认与重传机制。

假设 4 的确认收到了,5 的 ACK 丢了,6、7 的数据包丢了,该怎么办?

一种方法是超时重试,即对每一个发送了但是没有 ACK 的包设定一个定时器,超过了一定的事件就重新尝试。这个时间必须大于往返时间,但也不宜过长,否则超时时间变长,访问就变慢了。

如果过一段时间,5、6、7 都超时了就会重新发送。接收方发现 5 原来接收过,于是丢弃 5;6 收到了,发送 ACK,要求下一个是 7,7 不幸又丢了。当 7 再次超时的时候,TCP 的策略是超时间隔加倍。每当遇到一次超时重传的时候,都会讲下一次超时时间间隔设为先前值的两倍。

超时重传的机制是超时周期可能相对较长,是否有更快的方式呢?

有一个快速重传的机制,即当接收方接收到一个序号大于期望的报文段时,就检测到了数据流之间的间隔,于是发送三个冗余的 ACK,客户端接收到之后,知道数据报丢失,于是重传丢失的报文段。

例如,接收方发现 6、8、9 都接收了,但是 7 没来,所以肯定丢了,于是发送三个 6 的 ACK,要求下一个是 7。客户端接收到 3 个,就会发现 7 的确又丢了,不等超时,马上重发。

  • 流量控制的问题

在流量控制的机制里面,在对于包的确认中,会携带一个窗口的大小

简单的说一下就是接收端在发送 ACK 的时候会带上缓冲区的窗口大小,但是一般在窗口达到一定大小才会更新窗口,因为每次都更新的话,刚空下来就又被填满了

  • 拥塞控制的问题

也是通过窗口的大小来控制的
TCP 拥塞控制主要来避免两种现象,包丢失和超时重传,一旦出现了这些现象说明发送的太快了,要慢一点。
具体的方法就是发送端慢启动,比如倒水,刚开始倒的很慢,渐渐变快。然后设置一个阈值,当超过这个值的时候就要慢下来

慢下来还是在增长,这时候就可能水满则溢,出现拥塞,需要降低倒水的速度,等水慢慢渗下去。

拥塞的一种表现是丢包,需要超时重传,这个时候,采用快速重传算法,将当前速度变为一半。所以速度还是在比较高的值,也没有一夜回到解放前。

*** TCP和UDP区别:**

tcp是面向连接的,udp不是面向连接的
tcp面向字节流的,udp是基于数据报的
tcp保证数据正确性,udp可能丢包
tcp保证数据有序性,udp不保证

*** 为什么tcp是面向连接的**

tcp在数据传输前会有三报文握手建立连接,而udp没有

*** TCP为什么是可靠连接**

通过Tcp传输的数据无差错,有序,不丢失,不重复
Tcp报文头的序号使数据有序
报文头里的确认序号保证不丢包,累计确认和超时重传
Tcp有流量控制和拥塞控制机制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值