计算机网络

什么是TCP/IP

TCP/IP协议族

在互联网使用的各种协中最重要和最著名的就是 TCP/IP 两个协议。现在人们经常提到的TCP/IP并不一定单指TCP和IP这两个具体的协议,而往往表示互联网所使用的整个TCP/IP协议族。

  • 应用协议:TCP/IP体系中的应用层协议,主要包括HTTP(超文本传输协议)、SMTP(简单邮件传送协议)、FTP(文件传输协议)、TELNET(远程登录协议)、SNMP(简单网络管理协议)。

  • 传输协议:TCP/IP体系中的传输层协议,主要包括TCP(传输控制协议)、UDP(用户数据报协议)。

  • 网际互联协议:TCP/IP体系中的网络层协议,主要包括IP(Internet协议)、ARP(地址解析协议)、RARP(逆地址解析协议)、ICMP(因特网控制报文协议)、IGMP(因特网组管理协议)。

  • 路由控制协议:TCP/IP体系中的链路层协议,分为内部网关协议和域间路由协议。内部网关协议包括RIP(路由信息协议)、IGRP(内部网关路由协议)、EIGRP(增强内部网关路由协议)、OSPF(开放式最短路径优先协议)、IS-IS(中间系统到中间系统路由协议)。域间路由协议包括BGP(边界网关协议)。

TCP/IP四层模型

在这里插入图片描述

  • 应用层:为文件传输,为网络排错和Internet操作提供具体的程序应用

  • 传输层:为网络提供了流量控制,错误控制和确认服务。传输层有两个互不相同的传输协议:TCP(传输控制协议)、UDP(用户数据报协议)

  • 网络层:提供了独立于硬件的逻辑寻址,实现物理地址和逻辑地址的转换。网络层协议包括IP协议(网际协议),ICMP协议(互联网控制报文协议),IGMP协议(Internet组协议管理)

  • 网络接口层:主要是指一些物理层层次的接口,也称数据链路层,通常包括网络接口卡及设备驱动,之所以没有定义数据链路层,是因为TCP/IP 最初设计中已经考虑到多种数据链路层协议。

学习计算机网络时我们一般采用折中的办法,也就是中和 OSI 和 TCP/IP 的优点,采用一种只有五层协议的体系结构(应用层、传输层、网络层、 数据链路层、物理层),这样既简洁又能将概念阐述清楚。

基本工作原理

当你输入一个网址并按下回车键的时候,首先,应用层协议对该请求包做了格式定义;紧接着传输层协议加上了双方的端口号,确认了双方通信的应用程序;然后网络协议加上了双方的IP地址,确认了双方的网络位置;最后链路层协议加上了双方的MAC地址,确认了双方的物理位置,同时将数据进行分组,形成数据帧,采用广播方式,通过传输介质发送给对方主机。而对于不同网段,该数据包首先会转发给网关路由器,经过多次转发后,最终被发送到目标主机。目标机接收到数据包后,采用对应的协议,对帧数据进行组装,然后再通过一层一层的协议进行解析,最终被应用层的协议解析并交给服务器处理。

TCP/IP协议族中各协议之间的关系

在这里插入图片描述
各种应用进程就是通过不同的应用层协议来使用网络所提供的服务。例如,实现文件传输协议的FTP应用进程可以为用户提供计算机之间的文件传输服务,实现超文本传输协议的HTTP应用进程可以为用户提供浏览Web网页的功能等。

TCP和UDP是两个传输层协议。一般地,应用进程可以选择使用TCP或者UDP协议。如果应用层协议要求传输层提供可靠的服务,则应该选择TCP协议(打电话);如果应用层协议要求较高的数据传输速率,但是可以容忍一定的数据丢失,则可以选择UDP协议(直播)。TCP协议的数据单元称为TCP报文段或简称TCP段(TCPsegment),UDP协议的数据单元称为UDP数据报(UDPdatagram)。

IP协议是网际层上的一个主要协议。TCP和UDP协议都可以直接使用IP协议所提供的服务。IP协议的数据传送单位称为IP数据报或IP分组。TCP报文段或UDP数据报都可以封装在IP数据报中,以便在互联网上传输。除IP协议外,网际层还有其他协议,例如ICMP协议用于报告差错和其他重要信息;IGMP是多播组管理协议,是一个与多播有关的协议;ARP(地址解析协议)和RARP(逆向地址解析协议)用于提供IP地址与物理地址的映射关系。

封装和拆封

源主机封包:在这里插入图片描述

  1. 应用层:源主机将数据向下传输给传输层;
  2. 传输层:将数据分组,加上TCP首部形成TCP数据段,向下传输给网络层;
  3. 网络层:给TCP数据段加上源主机、目的主机IP首部,生成IP数据包,向下传输给链路层;
  4. 链路层:链路层在其MAC帧的数据部分装上IP数据包,再加上源主机,目的主机的MAC地址和帧头,并根据其目的的MAC地址,将MAC帧发往目的主机或IP路由器;

目标主机拆包:
在这里插入图片描述

  1. 链路层:在目的主机,链路层将MAC帧的帧头去掉,并将IP数据包向上传递给网络层;

  2. 网路层:检查IP报头,如果报头中校验和计算结果不一致,则丢弃该IP数据包,若校验和计算结果一致,则去掉IP报头,将TCP数据段向上传递给传输层;

  3. 传输层:检查顺序号,判断是否是正确的TCP分组,然后检查TCP报头数据,若正确,则向源主机发送确认信息,若不正确或丢包,则向源主机要求重发信息;

  4. 应用层:目的主机,传输层去掉TCP报头,将排好顺序的分组组成应用数据流送给应用程序,这样目的主机接收到的来自源主机的字节流,就像是直接接收来自源主机的字节流一样。

  1. TCP和UDP都使用一个16位的端口号来标识不同的应用程序。
  2. TCP、UDP、ICMP和IGMP等协议都要使用IP数据报传送数据,所以在IP数据报的首部定义一个8位的“协议”宇段,以说明是哪个协议的数据封装到了IP数据报中。协议宇段的值为1表示ICMP,为2表示IGMP,为6表示TCP,为17表示UDP。
  3. 太网帧首部定义了一个16位的“类型”字段,用来说明是哪个协议(ARP,RARP,IP)的数据

总结:数据在每层有不同的格式,从上到下依次叫数据段,数据包,数据帧,数据从应用层通过协议栈向下传递,每经过一层加上对应层协议报头,最后封装成"数据帧"发送到传输介质上,到达路由器或者目的主机去掉头部,交付给上层需要者。这一过程称为封装,传输,分离,分用。

数据段:TCP 数据流中的信息;
数据包:IP 和 UDP 等网络层以上的分层中包的单位;
数据帧:数据链路层中包的单位;

1. 应用层

应用层(application-layer)的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程间通信交互的规则。对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如域名系统DNS,支持万维网应用的 HTTP协议,支持电子邮件的 SMTP协议等等。我们把应用层交互的数据单元称为报文。
传输层及以下层提供了完整的通信服务, 应用层是面向用户的一层

DNS(基于UDP协议)

域名系统(Domain Name System缩写 DNS,DomainName被译为域名)将域名和IP地址相互映射一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。

域名组织形式

DNS名称说明示例
根域根服务器主要用来管理互联网的主目录
顶级域用于指定某个国家/地区/组织使用的类型名称.cn (中国)/ .com(企业)
第二层域个人或组织在Internet上使用的注册名称taobao.com
子域已注册的二级域名的派生域名,也就是网站名www.taobao.com
主机名DNS左侧的标签位标识了网络上的特定计算机h1.www.taobao.com

DNS解析过程
浏览器缓存—>本地缓存—>本地域名服务器—>主域名服务器—>根域名服务器

  1. 请求发出后先检查自身的浏览器缓存,如过有缓存过此域名对应的IP地址,则解析结束。

  2. 如果浏览器缓存没有命中,则去查看操作系统缓存中有没有对应解析的结果。(windows操作系统可以通过C盘中的hosts去设置操作系统缓存。目前操作系统为防止被操作系统缓存被篡改从而导致域名劫持,将hosts文件改为read-only。)

  3. 如果浏览器和操作系统缓存都没命中,则去请求本地域名服务器(LDNS)。此DNS服务器其实就是我们在配置网络设置时候的配置的DNS服务器,大部分的IP都会被缓存在这个DNS中。

  4. 若LDNS未命中,则去请求根域名服务器(Root Server) 。

  5. 根域名服务器返回给LDNS一个所查询域的主域名服务器(gTLD Server,国际顶尖域名服务器,如.com .cn .org等)地址.

  6. 此时LDNS再发送请求给上一步返回的gTLD.

  7. 接受请求的gTLD查找并返回这个域名对应的Name Server的地址,这个Name Server就是网站注册的域名服务器。

  8. Name Server根据映射关系表找到目标ip,返回给LDNS。

  9. LDNS缓存这个域名和对应的ip。

  10. LDNS把解析的结果返回给用户,用户根据TTL值缓存到本地系统缓存中,域名解析过程至此结束

DHCP协议(基于UDP协议)

DHCP(Dynamic Host Configuration Protocol):动态主机配置协议,是一个局域网的网络协议;基于CS模型;DHCP所有数据包都是基于UDP封装的。客户端使用的端口号为68,服务器端使用的端口号为67。

DHCP SERVER负责接收客户端的DHCP请求,集中管理所有客户机的IP地址设定资料,并负责处理客户端的DHCP请求,相比于BOOTP,DHCP通过“租约”来实现动态分配IP的功能,实现IP的时分复用,从而解决IP资源短缺的问题。

其地址分配方式有如下三种

  • 人工配置:由管理员对每台具体的计算机指定一个地址
  • 自动配置:服务器为第一次连接网络的计算机分配一个永久地址,DHCP客户端第一次成功地从DHCP服务器端分配到一个IP地址之后,就永远使用这个地址
  • 动态配置:在一定的期限内将地址租给计算机,客户端第一次从DHCP服务器分配到IP地址后,并非永久地使用该地址,每次使用完后,DHCP客户端就得释放这个IP地址,并且租期结束后客户必须续租或者停用该地址,而对于路由器,经常使用的地址分配方式是动态配置。

DHCP工作流程
在这里插入图片描述
DHCP详解参考博客

HTTP协议(基于TCP)

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的 WWW(万维网) 文件都必须遵守这个标准。设计 HTTP 最初的目的是为了提供一种发布和接收 HTML 页面的方法。

HTTP是一种无状态协议,无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即客户端发送HTTP请求后,服务器根据请求,会给我们发送数据,发送完后,不会记录信息。(使用 cookie 机制可以保持 session,解决无状态的问题)

HTTP版本及特点:

  • HTTP/0.9 —— 单行协议
  1. 请求不包含版本号信息,仅支持get请求;
  2. 协议由单行指令构成: GET /index.html;
  3. 响应无Header及状态码,仅包括HTML文档本身;
  • HTTP/1.0 —— 构建可扩展性
  1. 协议版本随GET行发送;
  2. 增添了请求头和响应头的概念,在通信中指定了 HTTP 协议版本号,以及其他的一些元信息 (比如: 状态码、权限、缓存、内容编码)
  3. 支持更多的请求方法:GET/HEAD/POST/PUT/DELETE;
  4. 支持更多的资源类型:html、图片、音视频等;

缺点

  1. HTTP请求基于TCP连接,HTTP/1.0协议中每次请求均需要建立TCP连接,不可服用;
  2. 安全性:是一种无状态协议,身份认真需要通过HTTP Cookie,明文传输数据,因此具有被攻击的危险;
  3. 协议开销大:头部信息过大后,每次请求都会携带这些信息;不仅造成带宽浪费,也会增加服务延时;
  • HTTP/1.1 —— 标准化的协议
  1. 持久连接(keep-alive):默认采用长连接,即同域名下建立一个TCP连接用于多次通信和数据传输;
  2. 管道机制:持久化连接中,可以不用等一个请求被响应后再发送请求,可以连续发送多个请求;当然,服务端的响应顺序是与请求顺序保持一致的;
  3. 引入新的缓存机制:引入cache-control机制;
  4. 内容协商机制:客户端与服务端约定请求的方法、语言、编码类型等信息;使用Accept/Accept-Language/Accept-Encoding等;
  5. 分块传输编码:支持Chunked Transfer Coding,对响应数据进行分块传输,每个chunk包含其大小及数据(均为十六进制),size信息独占一行;可以用于动态处理内容的传输;使用头部Transfer-Encoding: chunked标识;最后一个chunk仅包含size信息,用于告知数据传输完成;
  6. 更加丰富的请求方法:OPTIONS/GET/HEAD/POST/PUT/DELETE/TRACE/CONNECT;
  7. 新增状态码
    在这里插入图片描述
  • HTTP/2.0 —— quicker、better、safer
  1. 头部压缩:使用HPACK算法,减少每次传输不必要的头部信息;它的实质就是一种diff算法;客户端和服务端同时维护一张保存头信息的表,并在每次通信后同步更新;首次请求会保存全部字段;之后只需要传输差别信息即可;
  2. 二进制分帧:HTTP/2.0的每个请求或响应称为消息,每个消息分为一个或多个帧,采用效率更高的二进制而不是文本格式进行编码传输;
  3. 多路复用:同域名下建立一个TCP连接,该连接可以用于多个请求的处理;
  4. 服务器推送:即客户端请求一个页面后,服务端在未接受到后续请求时就返回响应请求,以及通过页面解析发现的客户端后续可能用到的资源(图片、css、js等);

HTTPS 和 HTTP

  • HTTPS 协议需要申请证书
  • HTTP 和 HTTPS 使用端口不一样,前者是80,后者是443
  • HTTP 协议运行在 TCP 之上,所有传输的内容都是明文,HTTPS 运行在 SSL/TLS 之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的
  • HTTPS 可以有效的防止运营商劫持
    HTTP与HTTPS区别详解
    结语:当前主流版本还是HTTP1.1,因为1.1目前可以满足人们的需求,而且2.0版本的报文开销很大

HTTP详解

2. 运输层

运输层(transport layer)的主要任务就是负责向两台主机的进程之间的通信提供通用数据传输服务。应用进程利用该服务传送应用层报文。

“通用的”是指并不针对某一个特定的网络应用,而是多种应用可以使用同一个运输层服务。由于一台主机可同时运行多个线程,因此运输层有复用和分用的功能。所谓复用就是指多个应用层进程可同时使用下面运输层的服务,分用和复用相反,是运输层把收到的信息分别交付上面应用层中的相应进程。

TCP/UDP协议

TCP(Transmisson Control Protocol)传输控制协议 –提供面向连接的,可靠的数据传输服务。
UDP(User Datagram Protocol)用户数据协议 –提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。

UDP 的主要特点

  1. UDP 是无连接的;
  2. UDP 使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态;
  3. UDP 是面向报文的;
  4. UDP 没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如直播,实时视频会议等);
  5. UDP 支持一对一、一对多、多对一和多对多的交互通信;
  6. UDP 的首部开销小,只有8个字节,比TCP的20个字节的首部要短。

TCP 的主要特点

  1. TCP 是面向连接的。(就好像打电话一样,通话前需要先拨号建立连接,通话结束后要挂机释放连接);
  2. 每一条 TCP 连接只能有两个端点,每一条TCP连接只能是点对点的(一对一);
  3. TCP 提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复、并且按序到达;
  4. TCP 提供全双工通信。全双工: 允许通信双方的应用进程在任何时候都能发送数据。TCP 连接的两端都设有发送缓存和接收缓存,用来临时存放双方通信的数据;
  5. 面向字节流。TCP 中的“流”(Stream)指的是流入进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和 TCP 的交互是一次一个数据块(大小不等),但 TCP 把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。

TCP的报文格式
在这里插入图片描述
源端口(Source Port):长度为16 bits(2个字节)。源端口。
目的端口(Destination Port):长度为16 bits(2个字节)。目的端口。
序列号(Sequence Number):长度为32 bits(4个字节)。指定了当前数据分片中第一字节的序列号。在TCP传输流中每一个字节为一个序号。如果TCP报文中flags标志位为SYN,该序列号表示初始化序列号(ISN),此时第一个数据应该是从序列号ISN+1开始。
确认序列号(Acknowledgment Number):长度为32bits(4个字节)。表示TCP发送者期望接受下一个数据分片的序列号。该序号在TCP分片中Flags标志位为ACK时生效。序列号分片的方向和流的方向同方向,而确认序列号分片方向和流方向反方向。
数据偏移(Data Offset): 长度为4bits。数据偏移也叫首部长度(Header Length)。因为首部长度实际也说明了数据区在分片中的起始偏移值。它表示TCP头包含了多少个32-bit的words。因为4bits在十进制中能表示的最大值为15,32bits表示4个字节,那么Data Offset的最大可表示15*4=60个字节。所以TCP报头长度最大为60字节。如果options fields为0的话,报文头长度为20个字节。
预留字段(Reserved field):长度为6bits。值全为零。预留给以后使用。
标志位(Flags): 长度为6bits。表示TCP包特定的连接状态。一个标签位占一个bit,值依次为URG、ACK、PSH、RST、SYN、FIN,新定义的TCP头还扩展了ECE,CWR,NS.

URG: 标识紧急指针是否有效
ACK: 标识确认号是否有效
PSH: 用来提示接收端应用程序立刻将数据从tcp缓冲区读走
RST: 要求重新建立连接. 我们把含有RST标识的报文称为复位报文段
SYN: 请求建立连接. 我们把含有SYN标识的报文称为同步报文段
FIN: 通知对端, 本端即将关闭. 我们把含有FIN标识的报文称为结束报文段

窗口(Window):长度16bits(2个字节)。用来告诉发送端接收端的buffer space的大小,TCP 要做流量控制,需要通信双方各声明一个窗口,标识自己当前的处理能力,接收端buffer大小用来控制发送端的发送数据数率,从而达到流量控制。最大值为65535.。
校验和(Checksum):长度16bits(2个字节)。用来检查TCP头在传输中是否被修改。
紧急指针(Urgent pointer):长度为16bits(2个字节)。表示TCP片中第一个紧急数据字节的指针。只有当URG标志置1时紧急指针才有效。
选项和填充(Option和pading):可变长度。表示TCP可选选项以及填充位。当选项不足32bits时,填充字段加入额外的0填充。
数据(Data):长度可变。用来存储上层协议的数据信息。可以为空。比如在连接建立和连接中止时。

TCP工作流程在这里插入图片描述

可靠传输

停止等待ARQ协议:分组发送之后必须暂时保留该分组的副本,每个分组都有编号,发送方发送消息后等待接收方确认,没有收到确认信息或者超时收到确认信息,发送方就会重传该分组,这种设计非常简单,但是对信道的利用率不高
在这里插入图片描述
连续ARQ协议(Automatic Repeat reQuest:自动重传请求)。 其实现的基础是建立在滑动窗口之上。连续ARQ规定,发送方维持一个发送窗口,凡位于发送窗口内的分组可以连续发送出去,而不需要等待对方确认。发送方每收到一个确认就将滑动窗口向前滑动一格。窗口是以字节为单位的。

接受方采用累积确认的方式:接收方不必每收到一个消息,就发送一个确认。而是在收到几条消息后,对按序到达的最后一条消息发送确认。表示这个消息之前的所有消息全部收到。

为了记录所有发送的包和接收的包,TCP 需要发送端和接收端分别来缓存这些记录,发送端的缓存里是按照包的 ID 一个个排列,根据处理的情况分成四个部分在这里插入图片描述
缓存和窗口
发送方维持的发送缓存和发送窗口,以及接收方维持的接收缓存和接收窗口
在这里插入图片描述
发送缓存用来暂时存放:

  • 发送应用程序传送给对方 TCP 准备发送的数据
  • TCP 已发送出但尚未收到确认的数据

已被确认的数据应当从发送缓存中删除,因此发送缓存和发送窗口的后沿是重合的。发送应用程序必须控制写入缓存的速率,不能太快,否则发送缓存就会没有存放数据的空间

接收缓存用来暂时存放:

  • 按序到达的、但尚未被接收应用程序读取的数据
  • 未按序到达的数据

收到的分组被检测出有差错,则丢弃。接收应用程序来不及读取收到的数据,接收缓存最终就会被填满,使接收窗口减小到零。接收应用程序能够及时从接收缓存中读取收到的数据,接收窗口就可以增大,最大亦不能超过接收缓存的大小

TCP 的流量控制:

  • 流量控制(flow control):让发送方的发送速率不要太快,要让接收方来得及接收(接收方接收性能可能不及发送方)
  • 接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,即调整TCP报文段首部中的“窗口”字段值,来限制发送方向网络注入报文的速率。

TCP 的拥塞控制

  • 拥塞(congestion):在某段时间,若对网络中某一资源(宽带,缓存等)的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种情况就叫做拥塞。
  • 拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载,也是通过窗口的大小来控制的。
  • 发送方根据其对当前网络拥塞程序的估计而确定的窗口值,这称为拥塞窗口,其大小与网络的带宽和时延密切相关。发送窗口的实际大小取min {接收窗口,拥塞窗口}
  • TCP 进行拥塞控制的算法有四种,即慢开始(slow-start)、拥塞避免(congestion avoidance)、快重传(fast retransmit)和快恢复(fast recovery)

总结:简单来说,接收缓存的大小限制了接收方接收数据的能力,从而确定了TCP报文中的窗口值,发送方根据这个窗口值确定自己发送窗口的大小,但是事实上,发送窗口的大小还要考虑网络性能,所以发送窗口=Min{接收窗口,拥塞窗口}(接收窗口反应接收方接收数据的能力,拥塞窗口反应网络性能)。

TCP建立连接(三次握手)

TCP标记及其含义
在这里插入图片描述
三次握手: 在通信之前,TCP会先通过三次握手的机制来确认两端口之间的连接是否可用。而UDP是不确认的,直接传

在这里插入图片描述

  • 最开始的时候发送方和接收方都是处于CLOSED状态。主动打开连接的为发送方,被动打开连接的是接收方。
  • 某个时刻发送方和接收方要进行通信,此时双方都有备好的端口,接收方的端口会处于监听状态,等待发送方的连接。

第一次握手:

发送方想要连接,创建传输控制块TCB,状态变为主动打开。发送给接收方不包含数据内容的连接请求报文。该请求报文首部中同步位SYN=1(标识该报文为连接请求报文),同时初始序列号seq=x。然后发送方进入 SYN-SENT (同步已发送)状态,告诉接收方我想和你同步连接。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。
第二次握手:

接收方收到连接请求报文,如果同意连接则发送确认报文。为了保证下次发送方发送报文时seq序列号是正确的,需要发送确认号ack=x+1,同时确认号ack要生效必须发送ACK=1,再加上同步位SYN=1,序列号seq=y,然后接收方也进 入SYN-RCVD (同步已收到) 状态,完成同步连接。这个报文也是SYN报文,也不能携带数据,但是同样要消耗一个序号。

第三次握手:

发送方收到确认后还要再向接收方发送确认报文。确认报文已经不是请求报文SYN了,不再包含SYN同步位。发送的内容有序列号seq=x+1(和第二次握手的ACK对应),确认号ack=y+1,ACK=1。发送方发送确认报文以后进入ESTABLISHED(已建立)状态,接收方接收到确认报文以后也进入ESTABLISHED状态。此时TCP连接完成建立。

貌似两次握手就可以建立连接,为什么要三次握手?

主要是为了防止已经失效的连接请求报文突然又传到了服务器,从而产生错误。

  • 如果是两次握手,假设一种情景:发送方发送了第一个请求连接报文并未丢失,只是因为网络问题在网络节点中滞留太久了。由于发送方迟迟没有收到确认报文,以为接收方没有收到连接请求。于是再发送一条请求连接报文,此时一路畅通完成两次握手建立连接,传输数据,关闭连接。然后那个前一条龟速的请求报文终于走到了接收方,再次和服务器建立连接,这就造成了不必要的资源浪费。
  • 如果是三次握手,就算那一条龟速的请求报文最后到达了接收方,然后接收方也发送了确认连接报文,但是此时发送方已经不会再发出确认报文了,接收方也接受不到确认报文,于是无法建立连接。

TCP释放连接(四层挥手)

数据传输完毕后,双方都可释放连接。建立连接后,双方都是处于ESTABLISHED状态,然后发送方主动关闭,接收方被动关闭。
在这里插入图片描述
第一次挥手:

发送方从ESTABLISHED状态变为主动关闭状态,发送方发送请求释放连接报文给接收方,FIN=1,seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时发送方进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。

第二次挥手:

接收方接收到发送方发来的请求释放报文以后,发送确认报文告诉发送方我收到了你的请求,内容差不多就是seq=v,ack=u+1,ACK=1,此时接收方进入CLOSE-WAIT(关闭等待)状态。

为什么是CLOSE-WAIT状态?可能接收方这端还有数据没有发送完,所以这个时候整个TCP的连接就变成了半关闭状态。接收方还能发送数据,发送方也能接收数据,但发送方不能再发送数据了,只能发送确认报文。

发送方接收到接收方传来的确认报文以后,进入 FIN-WAIT-1(终止等待2)状态,等待接收方发送连接释放的报文(在这之前,还需要接受接收方没有发送完的最后的数据)。

第三次挥手:

接收方所有的数据都发送完了,认为可以关闭连接了,于是向发送方发送连接释放报文,内容FIN=1,seq=w,ack=u+1(发送方没发送消息,所以提醒发送方下一次还是从u+1开始发送序列),ACK=1。此时接收方进入了 LAST-ACK(最后确认)状态,等待发送方发送确认报文。

第四次挥手:

发送方接收到了接收方发送的连接释放报文,必须发出确认。确认报文seq=u+1,ack=w+1,ACK=1。此时发送方进入 TIME-WAIT (时间等待)状态,但是没有立马关闭。此时TCP连接还没有释放,必须经过2∗MSL(最长报文段寿命,通常为2分钟)的时间后,当发送方撤销相应的TCB后,才进入CLOSED状态。

因为这个确认报文可能丢失。接收方收不到确认报文心想这可能是我没传到或者丢失了,于是接收方再传一个FIN,然后发送方再重新发送一个确认报文。然后刷新2∗MSL时间。直到这个时间内收不到FIN连接释放报文,发送方撤销TCB进入CLOSE状态。

而接收方,在接收到确认报文的时候就立马变为CLOSE状态了。所以接收方结束TCP连接的时间略早于发送方。

万一确认连接以后发送方故障怎么办?

TCP设有一个保活计时器。显然发送方故障时接收方不会智障般等下去,白白浪费资源。接收方每次收到一次发送方的请求以后都会刷新这个保活计时器,时间通常设置为2小时。若2个小时依旧没有收到发送方的任何数据,接收方会发送一个探测报文段,每隔75分钟发一个,如果连发十个都没有数据反应,那么接收方就知道发送方故障了,关闭连接。

3. 网络层

在计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多通信子网。网络层的任务就是选择合适的网间路由和交换结点, 确保数据及时传送。 在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组进行传送。在 TCP/IP 体系结构中,由于网络层使用 IP 协议,因此分组也叫 IP 数据报 ,简称 数据报
在这里插入图片描述

这里要注意:不要把运输层的“用户数据报 UDP ”和网络层的“ IP 数据报”弄混。另外,无论是哪一层的数据单元,都可笼统地用“分组”来表示。

这里强调指出,网络层中的“网络”二字已经不是我们通常谈到的具体网络,而是指计算机网络体系结构模型中第三层的名称.

互联网是由大量的异构(heterogeneous)网络通过路由器(router)相互连接起来的。互联网使用的网络层协议是无连接的网际协议(Intert Prococol)和许多路由选择协议,因此互联网的网络层也叫做网际层或IP层。

IP地址

TCP/IP协议网络上每个网络适配器都有一个唯一的ip地址。

IP 地址是一个 32 位的地址,这个地址通常分成 4 端,每 8 个二进制为一段,但是为了方便阅读,通常会将每段都转换为十进制来显示,比如大家非常熟悉的 192.168.0.1(本地局域网)

IP地址分为两部分,一部分是网络ID,另一部分是主机ID。但是具体哪一部分是网络D,哪一部分是主机ID并没有明确规定。因为有的网络需要主机很少,因此较短;而有些比较长,因此主机ID较长。

绝大部分 IP 地址属于以下几类

A 类地址:IP 地址的前 8 位代表网络 ID ,后 24 位代表主机 ID
B 类地址:IP 地址的前 16 位代表网络 ID ,后 16 位代表主机 ID
C 类地址:IP 地址的前 24 位代表网络 ID ,后 8 位代表主机 ID 在这里插入图片描述
关于子网划分参考下面这位大佬的博客
子网划分详解

IP协议

IP协议(Internet Protocol , 互联网协议)主要用于互联网通信。IP协议用于将多个包交换网络连接起来,他在原地址和目的地址之间传输数IP据报,还提供对数据大小的重新组装功能,以适应不同网络的要求。

要注意的是,IP不是可靠的协议,这是说,IP协议没有提供一种数据未传达以后的处理机制,这被认为是上层协议:TCP或UDP要做的事情。

IP报文格式
在这里插入图片描述
版本:IP协议的版本,目前的IP协议版本号为4,下一代IP协议版本号为6。

首部长度:IP报头的长度。固定部分的长度(20字节)和可变部分的长度之和。共占4位。最大为1111,即10进制的15,代表IP报头的最大长度可以为15个32bits(4字节),也就是最长可为15*4=60字节,除去固定部分的长度20字节,可变部分的长度最大为40字节。

服务类型:ToS服务类型。指明以何种方式处理数据报文

总长度:IP报文的总长度。报头的长度和数据部分的长度之和。

标识:唯一标识主机发送的每一份数据报。通常每发送一个报文,它的值加一。当IP报文长度超过传输网络的MTU(最大传输单元)时必须分片,这个标识字段的值被复制到所有数据分片的标识字段中,使得这些分片在达到最终目的地时可以依照标识字段的内容重新组成原先的数据。比如A报文被分成A1和A2两片,那么A1和A2的标识值是相同的。该标识,标志和片位移结合,实现在接受端组合分片报文。

标志:共3位。R、DF、MF三位。目前只有后两位有效,DF位:为1表示不分片,为0表示分片。MF:为1表示“更多的片”,为0表示这是最后一片。

片位移:本分片在原先数据报文中相对首位的偏移位。(需要再乘以8)

生存时间:IP报文所允许通过的路由器的最大数量。每经过一个路由器,TTL减1,当为0时,路由器将该数据报丢弃。TTL 字段是由发送端初始设置一个 8 bit字段.推荐的初始值由分配数字 RFC 指定,当前值为 64。发送 ICMP 回显应答时经常把 TTL 设为最大值 255。

协议:指出IP报文携带的数据使用的是那种协议,以便目的主机的IP层能知道要将数据报上交到哪个进程(不同的协议有专门不同的进程处理)。和端口号类似,此处采用协议号,TCP的协议号为6,UDP的协议号为17。ICMP的协议号为1,IGMP的协议号为2.

首部校验和:计算IP头部的校验和,检查IP报头的完整性。

源IP地址:标识IP数据报的源端设备。

目的IP地址:标识IP数据报的目的地址。

ICMP协议(基于IP协议)

IP协议并不是一个可靠的协议,它不保证数据被送达,那么,自然的,保证数据送达的工作应该由其他的模块来完成。其中一个重要的模块就是ICMP(网络控制报文)协议。ICMP不是高层协议,而是IP层的协议,ICMP报文是封装在IP报文里面的。

当传送IP数据包发生错误。比如主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,然后传送回给主机。给主机一个处理错误的机会,这也就是为什么说建立在IP层以上的协议是可能做到安全的原因。

在这里插入图片描述
ICMP报文格式
在这里插入图片描述
在这里插入图片描述

ICMP报文类型
在这里插入图片描述

ARP协议与RARP协议

ARP协议(Address Resolution Protocol:地址解析协议):将网络层IP地址转换为数据链路层MAC地址
在这里插入图片描述
ARP缓存表
在这里插入图片描述
ARP缓存表缓存了IP地址与MAC地址的映射关系,没有映射关系会去 “查找” MAC地址,IP地址是可能发生变化的,这导致RAP缓存表也是有时效的
RARP(Reverse Address Resolution Protocol:逆地址解析协议):正好相反,是将MAC地址解析成IP地址的协议。

NAT技术

NAT(Network Address Translation )网络地址转换,内网IP和外网IP间相互转化的技术,在一定程度上能够有效的解决公网地址不足的问题,但也是网络通信更加复杂。
在这里插入图片描述

内部网关协议

RIP协议(基于UDP协议)

是一种分布式的基于距离向量的路由选择协议,适用于小型网络;

分布式:每个路由器不断地和相邻路由器交换信息;(所交换的是当前路由器知道的所有路由信息,每隔30s交换一次)

距离向量:从当前路由器每经过一个路由器则距离加一;记录到达每个路由器的距离,以找出最小距离;当跳数为16时,认为目标网络不可达,故适用于小型网络

RIP2报文格式
在这里插入图片描述
RIP路由表

目的网络距离下一跳路由器
Net14R8
Net21直接交付

OSPF协议(基于IP协议)

OSPF(Open shortest path first,开放式最短路径优先),是一种链路状态型协议,基于SPF算法。OSPF是一种层次式的协议,他不向邻居通告路由项,而是向邻居通告的是链路状态信息,由各路由器根据链路状态数据库自行计算生成路由表。

使用了Dijkstra的最短路径算法,OSPF中加入了区域号,适用于大型网络。

OSPF报文
在这里插入图片描述
OSPF的五种类型分组

  1. 问候(Hello)分组:用来发现和维持邻居的可达性,在广播网络中还可以用来选举DR和BDR

  2. 数据库描述分组:向邻居发送的链路状态数据库的摘要信息

  3. 链路状态请求分组:向对方请求发送的链路状态项目的详细信息

  4. 链路状态更新分组:用洪泛法向全网发送链路状态更新

  5. 链路状态确认分组:对收到的链路状态更新分组进行确认

OSPF的工作过程
6. 了解直连网络:正确配置接口的IP地址和子网掩码并激活接口,并将接口包含在一条network语句中
7. 发送HELLO包:建立OSPF邻居关系:邻居是指同样在链路对应接口上启用了OSPF功能的路由器
8. 建立链路状态数据包:其中包含与该路由器直接相连链路的各种状态,包括邻居ID,链路类型和带宽等。一旦建立了临界关系,即可创建LSP
9. 将链路状态数据包泛洪至邻居:每台路由器将自身库中的LSP都泛洪给邻居路由器,直至区域内所有OSPF路由器都具有相同的LSDB(链路状态数据库)
10. 建立自身的路由表:路由器根据链路状态数据库,使用SPF算法,各自建立自己的路由表

外部网关协议BGP

BGP(Border Gateway Protocol)外部网关协议用来解决不同自治系统AS(Autonomous System)之间的路由选择策略;

边界网关协议不追求寻找最佳路径,而是在可到达的基础上找到一条相对较好的路径(由于政治,安全等原因);

BGP发言人:在BGP协议中,一个自治系统中用来与其他自治系统(通过TCP连接)交换路由信息的路由器

交换信息的两个BGP发言人彼此成为临站或对等站,所交换的信息是可达性信息;

每个发言人除了要运行BGP协议外,还要运行本自治系统内部的协议;

BGP能够进行路由优选、避免路由环路、更高效率的传递路由和维护大量的路由信息。

4. 数据链路层

数据链路层(data link layer)通常简称为链路层两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。数据链路协议的三个基本共同问题:封装成帧,透明传输,差错检测

封装成帧

在这里插入图片描述
在两个相邻节点之间传送数据时,数据链路层将网络层送下来的 IP 数据报组装成帧(前后分别添加首部和尾部),在两个相邻节点间的链路上传送帧, 每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。

在接收数据时,控制信息使接收端能够知道一个帧从哪个比特开始和到哪个比特结束。这样,数据链路层在收到一个帧后,就可从中提出数据部分,上交给网络层。

控制信息还使接收端能够检测到所收到的帧中有误差错。如果发现差错,数据链路层就简单地丢弃这个出了差错的帧,以避免继续在网络中传送下去白白浪费网络资源。如果需要改正数据在链路层传输时出现差错(这就是说,数据链路层不仅要检错,而且还要纠错),那么就要采用可靠性传输协议来纠正出现的差错。这种方法会使链路层的协议复杂些。

以太网协议

以太网是一种广泛使用的局域网技术,是一种应用与数据链路层的协议,使用以太网可以完成相邻设备的数据帧传输。

以太网帧格式
以太帧有多种,常用的是Ethernet II。
在这里插入图片描述
Eth II以太网帧最小长度 64字节,最大长度1518字节。

源地址目的地址是指网卡的硬件地址(即MAC地址),长度是48位,是在网卡出厂时固化的。
类型: 长度是2位,标识该帧网络层协议的类型,告诉接收方使用何种协议 进行拆封
在这里插入图片描述
FCS: 帧校验序列 Frame Check Sequence

MAC地址与IP地址

  • 在数据发送传输的过程中,目的 IP 地址与源 IP 地址是永远不会变的,这是这个数据的起始与终点,而 MAC 地址是一直在变化的,由于数据在传输的过程中会经历很多的主机等,所以在这个过程中 MAC 地址一直在变。类似于我们坐车,要坐车从 A 出发,目的地是 D。这个过程中我们会经过 B C,在到达 B 的时候,此时的 MAC 地址相当于我们上一站是 A , 下一站是 C。而目的 IP 地址与 源 IP 地址 分别是 D 与 A,这样说的话就很好理解了。

  • MAC 地址与 IP 地址,一个代表的目的与终点,一个代表着途中的经过。所以在到达目的局域网后,数据包并不知道要传输给哪台主机,因为 MAC 地址的变化,但是目的 IP 地址一直没有变化,所以此时就需要 ARP 协议来确定目的主机的 MAC 地址。

MTU

数据链路层要求在网络层传输过来的数据包必须在 MTU 范围内,以太网帧中的数据长度必须在 46字节到1500字节当中去。也就是说在 IP 层在添加报头信息之前,要判断此时由传输层传输过来的数据段是否超过了 1480 个字节(以太网帧中的数据包括 IP 协议的报头信息,IP 协议的报头信息为 20 字节),如果超过了,那么则对该数据段进行分片,所有被分片的数据的 IP 报头信息当中,它们的 16 位标识都是相同的,并且报头信息中的标志字段中第二位为 0 ,第三位如果为 1 ,代表着报文的结束。

接收端在接收到这里分片数据后,根据 IP 报头信息的 16 为标识信息、三位标志位、13位偏移量信息进行组装。

如果分片后的数据在接收端丢失某一片,那么就组装失败。即使组装失败, IP 层也不负责重新传输的功能。这是传输层所该做的事情。

我们发现 ARP 协议与 RARP 协议它们的实际数据只有 28 个字节,于是在它的报文后进行补位,其中 PAD 就是用来填充的,使 ARP / RARP 协议的长度达到 MTU 的最小字节数。

对于 UDP 传输的影响
一旦 UDP 携带的数据超过了 1472 (MTU - IP报头 - UDP报头 = 1500 - 20 - 8),那么在 IP 层就会对该数据分片,一旦分片就意味着增加了 UDP 传输丢包的可能性。 由于 UDP 协议传输本身就不负责可靠性,再加上分片,那么丢包的可能性就大大增加。

对 TCP 传输的影响
TCP 协议在传输时也收到 MTU 的影响。一个 TCP 数据报的最大长度为 MSS 。MSS 处于 TCP 报头信息选项中。在 TCP 进行链接的时候,双方在发送 SYN 与 SYN + ACK 时就会在选项内对 MSS 进行设置。在双方都得到对方的 MSS 时,选择较小的 MSS 的值作为最终的 MSS 。

再说明白点,MSS 的大小其实就是应用层给传输层的交付的数据的大小。不包括传输层的报头信息。所以在计算 MSS 的时候,用 MTU 减去网络层报头长度以及传输层报头长度即可。

链路层参考博客

5 物理层

在物理层上所传送的数据单位是比特。
物理层(physical layer)的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。 使其上面的数据链路层不必考虑网络的具体传输介质是什么。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说,这个电路好像是看不见的。

一个大佬对各个协议的总结

posted @ 2021-02-16 19:48  isalo  阅读(29)  评论(0编辑  收藏  举报