总结自百度百科,维基百科

前言

回一下大学网络老师画下的必考重点:OSI 七层通讯协议,自下而上依次为:
物理层(Physics Layer)
数据链路层(Data Link Layer)
网络层(Network Layer)
传输层(Transport Layer)
会话层(Session Layer)
表示层(Presentation Layer)
应用层(Application Layer)

协议分布

网络层协议:IP (IPv4 · IPv6) · ICMP· ICMPv6·IGMP ·IS-IS · IPsec · ARP · RARP · RIP等
传输层协议:TCP · UDP · TLS · DCCP · SCTP · RSVP · OSPF 等
应用层协议:DHCP ·DNS · FTP · Gopher · HTTP· IMAP4 · IRC · NNTP · XMPP ·POP3 · SIP · SMTP ·SNMP · SSH ·TELNET · RPC · RTCP · RTP ·RTSP· SDP · SOAP · GTP · STUN · NTP· SSDP · BGP 等

常用协议类别

操做系统所使用的某类协议,不具体指某个协议,目前使用最广泛的是TCP/IP,前端所涉及的范围

TCP/IP协议

TCP/IP(Transport Control Protocol/Internet Protocol,传输控制协议/Internet协议)为了实现不同网络之间的互连,美国国防部于1977年到1979年间制定了TCP/IP体系结构和协议。TCP/IP是由一组具有专业用途的多个子协议组合而成的,这些子协议包括TCP、IP、UDP、ARP、ICMP等。TCP/IP凭借其实现成本低、在多平台间通信安全可靠以及可路由性等优势迅速发展,并成为Internet中的标准协议。在上世纪90年代,TCP/IP已经成为局域网中的首选协议,在最新的操作系统(如Windows7、Windows XP、Windows Server2003等)中已经将TCP/IP作为其默认安装的通信协议。

NetBEUI

即NetBios Enhanced User Interface ,或NetBios增强用户接口。它是NetBIOS协议的增强版本,曾被许多操作系统采用,例如Windows for Workgroup、Win 9x系列、Windows NT等。NETBEUI协议在许多情形下很有用,是WINDOWS98之前的操作系统的缺省协议。NetBEUI协议是一种短小精悍、通信效率高的广播型协议,安装后不需要进行设置,特别适合于在“网络邻居”传送数据。所以建议除了TCP/IP协议之外,小型局域网的计算机也可以安上NetBEUI协议。另外还有一点要注意,如果一台只装了TCP/IP协议的WINDOWS98机器要想加入到WINNT域,也必须安装NetBEUI协议。

IPX/SPX协议

本来就是Novell开发的专用于NetWare网络中的协议,但是也非常常用—大部分可以联机的游戏都支持IPX/SPX协议,比如星际争霸,反恐精英等等。虽然这些游戏通过TCP/IP协议也能联机,但显然还是通过IPX/SPX协议更省事,因为根本不需要任何设置。除此之外,IPX/SPX协议在非局域网络中的用途似乎并不是很大。如果确定不在局域网中联机玩游戏,那么这个协议可有可无。

TCP

传输控制协议(TCP,Transmission Control Protocol)
是一种面向连接的、可靠的、有序的、基于字节流的传输层通信协议

出现原因

由于网络拥堵,流量负责均衡等不可预测的网络行为,出现ip数据包丢失,重复,和无序传递

建立连接(三次握手)

面试高频,但这只是在数据传输之前保证传输可靠性的一个过程,简单来说它的作用就是客户端和服务端互相确认对方具备 发送 和 接受 数据的能力,从而建立可靠的数据连接通道,进行后续的数据传输。

标记含义

在三次握手过程通过

sequence number (seq)

SYN=1 时,会生成一个随机序列(随机保证数据的保密性)
SYN=0 时,序列数表示这是序列号,第一次的序列号+数据包编号

acknowledgement numner (ack)

ACK=1 时,返回给发送者,我收到你发的内容了(seq+1)

ACK

表示这是个确认数据包(我收到你发我的数据了)

SYN

如果设置了 SYN 标志 (1),则这是初始序列号。实际第一个数据字节的序列号和相应ACK中的确认号就是这个序列号加1
如果 SYN 标志清除 (0),则这是当前会话的该段的第一个数据字节的累积序列号。

TCP头

image.png

连接过程

1. SYN=1,seq=x

SYN=1 (这是第一次给你发送请求)
seq=x(你要从 x 开始编号了)
… 等你回复

x是一个客户端在第一次请求的时候生成的随机数,为什么是随机的呢?不是随机的那岂不是随随便便别人就可以随意给服务端发包,服务端无法确认真伪
在之后的请求中,客户端每次发送 都会加1
第二次发送:x+1
第三次:x+2
服务端以此保证包的有序性

2. SYN=1,ACK=1,seq=y,ack=x+1

SYN=1(这是我第一次给你的回复包)
ACK=1(这是个确认包,确认我收到了)
seq=y (你要从y开始编号了,结束之后看看有没有漏的)
ack=x+1 (你看我没骗你,我收到了,你发我序列号是x的包)
… 等你回复

3.ACK=1,seq=x+1,ack=y+1

ACK=1(这是个确认包,确认我收到了)
seq=x+1(SYN=0,这是继续之前发的包,序列号是1)
ack=y+1(你看我没骗你,我收到了,你发我序列号是y的包)

然后服务端收到信息确认后,会打开传输通道

常用网络协议 - 图2

窗口滑动

假如要发送1000个数据包,客户端是一起发送,不管客户端应答,还是每发一个,等确认,再发下一个?这样无疑都可能会造成传输处理时间过久
所以就有了窗口滑动,就是约定好,几个数据包确认一次。
偷个图
image.png

断开连接(四次挥手)

标记含义

在三次握手的 ACK,sequence number,acknowledgement numner 的基础上,还有FIN 标记

FIN

表示这是最后一个数据包了,收工

连接过程

1. FIN=1,seq=f ——->

FIN=1(这边发完了,你看看可以收工了) seq=f (收工sequence)

2. ACK=1,seq=s,ack=f+1 <——-

ACK=1(知道了,这是个确认回复包)seq=s(回复包的序列是s)ack=f+1 (你看我没骗你,我收到的是序列=f的包)

3. FIN=1,ACK=1,seq=z,ack=f+1 <——-

FIN=1(这边收完了,下班了)ACK=1(这是个确认回复包)seq=z(序列是z)ack=f+1

1. ACK=1,seq=f+1,ack=z+1 ——->

ACK=1(等你等的都饿了,知道了)seq=f+1(这是发送结束的第二个包)ack=z+1(回复的是你的 消息 )
关闭连接

丢包重传

基于dupack重传

如果服务端没有收到第100个包,收到了99个,会重复发第99个确认包给客户端,客户端收到确认包超过3个,就知道下一个包丢失了

基于超时的重传

发送第一遍时设置超时时间是t,时间长了等不到回复会重传,超过t发送第二遍就是2t
另外,tcp还具备 错误检查避免拥塞流量控制等功能

TCP 慢启动

TCP 连接会随着时间进行自我「调谐」,起初会限制连接的最大速度,如果数据成功传输,会随着时间的推移提高传输的速度。这种调谐则被称为 TCP 慢启动。

UDP

用户数据报协议(UDP,User Datagram Protocol)
是面向消息的传输层协议,不需要预先通信来建立连接,不保证交付、有序,重复保护
尽可能快速的把数据包发送出去,时间敏感的应用程序通常使用UDP,因为丢弃数据包比等待重传数据包更可取。
UDP提供数据完整性和校验和(UDP和TCP,IP 都是使用此方式校验数据的完整性,可以简单理解为所有数据的位数,不关心数据的真实性,顺序,是否正确)

适用场景

报头

image.png

长度

该字段指定 UDP 报头和 UDP 数据的字节长度。最小长度为 8 个字节,即头部的长度。字段大小为 UDP 数据报设置了 65,535 字节(8 字节标头 + 65,527 字节数据)的理论限制。
由底层IPv4协议强加的数据长度的实际限制为65,507 字节( 2^3^16位)(65,535 字节 - 8 字节 UDP 标头 - 20 字节IP 标头
使用 IPv6,UDP 数据报的大小可能大于 65,535 字节。

可靠性和拥塞控制

由于缺乏可靠性,UDP应用程序可能会丢失数据包,重新排序,错误或重复,最终程序必须提供必要的握手,比如确认消息已接受完成,例如TFTP。
大多数情况下,UDP不采用可靠性传输机制,例如流媒体,实时语音,多人游戏等,如果使用可靠传输,重传和握手确认等会造成抖动,比丢包造成的影响大很多。

UDP 和 TCP 的比较

TCP是面向连接的协议,需要握手来建立端到端的通信。一旦建立了连接,就可以通过该连接双向发送用户数据。

  • 可靠——TCP 管理消息确认、重传和超时。多次尝试传递消息。如果数据在此过程中丢失,将重新发送数据。在 TCP 中,要么没有丢失数据,要么在多次超时的情况下断开连接。
  • 有序– 如果通过连接依次发送两条消息,则第一条消息将首先到达接收应用程序。当数据段以错误的顺序到达时,TCP 会缓冲乱序数据,直到所有数据都可以正确重新排序并交付给应用程序。
  • 重量级- TCP 需要三个数据包来建立套接字连接,然后才能发送任何用户数据。TCP 处理可靠性和拥塞控制
  • 流– 数据作为字节流读取,不向信号消息(段)边界传输可区分的指示。

UDP一种更简单的基于消息的无连接协议。无连接协议不建立专用的端到端连接。通信是通过从源到目的地在一个方向上传输信息来实现的,而无需验证接收器的准备情况或状态。

  • 不可靠—当发送 UDP 消息时,无法知道它是否会到达目的地;它可能会在途中迷路。没有确认、重传或超时的概念。
  • 未排序– 如果将两条消息发送给同一个收件人,则无法保证它们到达的顺序。
  • 轻量级- 没有消息排序,没有跟踪连接等。它是一个非常简单的传输层,设计在 IP 之上。
  • 数据报– 数据包单独发送并在到达时检查完整性。数据包有明确的边界,在收到时予以遵守;接收方套接字上的读取操作将产生最初发送的完整消息。
  • 无拥塞控制 — UDP 本身并不能避免拥塞。拥塞控制措施必须在应用层或网络中实施。
  • 广播 — 无连接,UDP 可以广播 - 发送的数据包可以寻址为子网上的所有设备都可以接收。
  • 多播 —支持多播操作模式,单个数据报包可以自动路由,而不会重复发送到一组订阅者。

    DHCP

    (Dynamic Host Configuration Protocol,动态主机配置协议)
    DHCP协议支持C/S(客户端/服务器)结构,主要分为两部分:
    1、DHCP客户端:通常为网络中的PC、打印机等终端设备,使用从DHCP服务器分配下来的IP信息,包括IP地址、DNS等。
    2、DHCP服务器:所有的IP网络设定信息都由DHCP服务器集中管理,并处理客户端的DHCP请求。
    DHCP采用UDP作为传输协议,客户端发送消息到DHCP服务器的的67号端口,服务器返回消息给客户端的68号端口。

    RPC

    远程调用(Remote Procedure Call)
    第三方的客户程序通过接口调用SAP内部的标准或自定义函数,在tcp上面进行的封装。获得函数返回的数据进行处理后显示或打印。
    类似java的webService, hsf的rpc风格

    NFS

    远程文件系统(Network File System)
    能使使用者访问网络上别处的文件就像在使用自己的计算机一样,远程文件调用系统

    NTP

    网络时间协议(Network Time Protocol
    NTP网络时间协议, 就是为了计算出设备之间的时间差。根据NTP方式计算出来的时间差, 用户就可以把设备设置成相同的时间。
    比如,设备A现在的时间是10:00:00, 而设备B的时间是11:00:00。 此时如果你想让设备A校对成设备B的时间。那么就是需要NTP网络时间协议,计算出设备之间的时间差后,给设备A设上去就好了。

误差依旧是存在的,因为设备A——->设备B的网络时间,和设备B——->设备A的网络时间, 是不一样的。两者的差值就是误差。对于误差的计算有具体的计算方法,需要深入了解的自行了解。

RTSP

实时流传输协议(real time streaming protocol)

TFTP

简单文件传输协议(Trivial File Transfer Protocol)
基于UDP的传输
任何传输起自一个读取或写入文件的请求,这个请求也是连接请求。如果服务器批准此请求,则服务器打开连接,数据以定长512字节传输。每个数据包包括一块数据,服务器发出下一个数据包以前必须得到客户对上一个数据包的确认

[

](https://blog.csdn.net/zjuter/article/details/104921294)

WebSocket

WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
在 2009 年诞生,于 2011 年被 IETF 定为标准 RFC 6455 通信标准。并由 RFC7936 补充规范。WebSocket API 也被 W3C 定为标准

为什么会有websocket?

由于http 只能由客户端发起,需要服务端推送时,只能通过ajax轮询,做不到服务端主动,所以有了websocket
现在更有很多服务端的推送方案
服务端推送方案
image.png