三天两夜肝完这篇万字长文,终于拿下了TCP/IP

2020/7/14 17:09:40

本文主要是介绍三天两夜肝完这篇万字长文,终于拿下了TCP/IP,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

前言


计算机网络是一门基础课程,但是老师所讲的东西无非起到一个抛砖引玉的作用。然而对于需要自学的人来说,无疑是更难的。前路漫漫~~

计算机网络本来就是比较枯燥的,文章内容较多,建议读者耐心看完这篇文章,希望大家看完后都能有所收获。先把这篇文章的大致结构放上来。

预备知识


谢希仁的那本《计算机网络》是很多大学选择的计网教材,在第一章是一个概论,大致讲了计算机网络的发展,也可以说是每个人都必须了解的小常识。在这里,我就做一个总结概括,把它作为学习计网预备知识。

互联网简史

  • 第一阶段:20世纪50年代,数据通信技术与网络理论基础研究
  • 第二阶段:20世纪60年代,ARPANET与分组交换技术
  • 第三阶段:20世纪70年代中期,网络体系结构与网络协议的标准化
  • 第四阶段:20世纪90年代,互联网、高速网络、无线网络、移动互联网与网络安全技术发展

互联网的发展

计算机网络的发展主要经历了下面的七个阶段。

  • 批处理:为了让更多的人使用计算机,出现了批处理系统。所谓的批处理,是指事先把用户数程序数据装入卡带或者磁带,并由计算机按照一定顺序读取。

  • 分时系统:批处理系统之后,又出现分时系统。它是指多个终端同时与计算机连接,允许多个用户同时使用计算机。

  • 计算机通信技术:在分时系统中,我们看到了终端和计算机的连接,但这并不意味着计算机与计算机之间也已互联连接。随着计算机的数量普及,计算机之间的数据交互的便捷性越来越受到重视,最开始两个主机之间交互数据过程相当繁琐,因此计算机通信技术(计算机与计算机之间由通信线路连接)应运而生。人们可以很轻松的即时读取另一台计算机中的数据,从而极大地缩短了传输数据的时间。

  • 计算机网络的产生:20世纪70年代,人们开始实验基于分组交换技术的计算机网络,并着手研究不同厂商的计算机之间相互通信的技术。到了80年代,一种能够互联多种计算机的网络应运而生。网络通信技术进入了发展的高速公路。

  • 互联网的普及:进入20世纪90年代,随着计算机的价格降低、性能增强、各类应用纷纷冒头,计算机普及程度越来越高。面对这一趋势,各家厂商不仅要保证生产产品的自身互联性,还着力于让自己的网络技术不断与互联网技术(TCP/IP)兼容。

  • 互联网时代: 随着互联网的普及,现在,人们越来越离不开互联网了。生活、学习工作也都得依靠网络信息,万物互联的时代早就已经到来了。

  • 网络安全时代: 互联网给世界带来了颠覆性的改变,给人们日常生活带来了极大的便利,互联网呈现给现代人一个高度便捷的信息网络环境,在国家面前,犹如水电煤气一样,成为了国家必不可少的重要资源,随着万物互联,网络安全必定是国家安全最重要的一环。在互联网普及的初期,人们更关注单纯的连接性,注重不受任何限制的建立连接。但现在,人们不再满足与“单纯的连接”而是更为追求“安全的连接”。

网络的性能指标

  • 比特: 比特(bit)是计算机中数据量的单位,也是信息论中使用的信息量的单位。英文单词bit来源于binary digit,意思是一个“二进制数字”。网络技术中的速率指的是连接在计算机网络上的主机在数字信道上传送数据的速率,它也称为数据率(data rate)或比特率(bit rate)。
  • 带宽:在计算机网络中,带宽用来表示网络的通信线路传送数据的能力,因此网络带宽表示单位时间内从网络中的某一点到另一点所能通过的“最高数据率”。这种意义的带宽的单位是比特/秒。
  • 吞吐量:吞吐量(throughput)表示在单位时间内通过某个网络(或信道、接口)的数据量,他表示当前网络传输数据的能力。
  • 时延
    • 1、发送时延:指主机或路由器发送数据帧所需要的时间,也就是从发送数据帧的第一个比特算起,到该帧的最后一个比特发送完毕所需要的时间。
    • 2、传播时延:指电磁波在信道中传播一定距离需要花费的时间。
  • 时延带宽积:时延带宽积表示链路可容纳的比特数,因此,链路的时延带宽积又称为以比特为单位的链路长度。
  • 往返时间RTT:往返时间RTT,表示从发送方发送数据开始,到发送方收到来自接收方的确认(接收方收到数据后便立即发送确认),总共经历的时间。往返时间一般就会包括分组在网络中的各种时延。
  • 利用率:利用率可以分为信道利用率和网络利用率两种。信道利用率指出某信道有百分之几的时间是被利用的(有数据通过)。完全空闲的信道的利用率是零。网络的利用率则是全网络的信道利用率的加权平均值。信道利用率并非越高越好,这是因为,根据排队论的理论,当某信道的利用率增大时,该信道引起的时延也会迅速增加。信道或网络的利用率过高会产生非常大的时延。

不能不知道的小常识

计算机网络的分类

按照地理覆盖范围来分类的话,计算机网络可以被分为一下三个部分:

  • 局域网(Local Area NetWork,LAN),常见的办公室、宿舍或网吧中的网络就是局域网几米到10km以内。 其特点是:连接范围窄,用户少,配置容易,连接速率高。

  • 城域网(Metropolitan Area NetWork,MAN),用于将一个城市、一个地区的企业、机关或学校的局域网连接起来,实现区域内的资源共享

  • 广域网:广域网(Wide Area Network,WAN),也称为远程网,不同城市间的LAN或者MAN网络互连,因为距离远,信息衰减比较严重,所以这种网络一般要租用专线,通过特殊协议进行连接,构成网状结构,广域网因为所连接的用户多,所以每个用户的连接速率一般较低。

计算机网络的拓扑结构

  • 总线结构
    • 优点:费用较低,易于扩展,线路的利用率高;
    • 缺点:可靠性不高,维护困难,传输效率低。
  • 环形结构
    • 优点:令牌控制,没有线路竞争,实时性强,传输控制容易;
    • 缺点:维护困难,可靠性不高

  • 星型结构
    • 优点:可靠性高,方便管理,易于扩展,传输效率高.
    • 缺点:线路利用率低,中心节点需要很高的可靠性和冗余度。

计算机有哪些结构

有三种不同的计算机网络分层模型:

  • OSI七层模型

  • 五层结构模型

  • TCP/IP分层结构模型

是是说说说说说说

TCP/IP协议是当前互联网所遵循的协议,它并不是单纯地由TCP或者IP组成,而是由各层的协议一起组成的,构成我们通常说说的TCP/IP协议栈。但是为了更好的理解,后面文章也是按照五层协议来写的。

物理层


这边先给一个建议,大家在学习计算机网络的时候不应该把每个网络协议单独拿出来学习,应该明白它的产生原因以及在整个计算机网络的作用。

数字信号与模拟信号

它的作用是:屏蔽不同的传输媒体和通信手段的差异。我们都知道,自然界的信号无非就是两种,一种是数字信号,另一种就是模拟信号。那么是什么模拟信号?什么又是数字信号呢?

说白了,所谓的模拟信号就是连续变化的物理量,模拟信号其特点是幅度连续(连续的含义是在某一取值范围内可以取无限多个数值)。模拟信号,其信号波形在时间上也是连续的,因此它又是连续信号。我们对连续信号进行抽样,就会得到抽样信号,但抽象信号就是离散的(说着说着就说到了信号系统,看来补考对我的影响还是有的)。但数字信号是不同于模拟信号的,他在时间域上是离散的,它有两种不同状态的物理量,分别用“0”,“1”来表示。这就好像电灯开关一样,也有两种不同的状态。

当然,数字信号与模拟信号是可以相互转换的,模拟信号通常使用PCM(脉冲编码调制)方法量化并转换为数字信号,PCM方法是使不同范围的模拟信号对应不同的二进制值。通常,数字信号通过载波相移得到模拟信号。

物理层的传输媒介

我们大家都知道,数据在物理层传输的媒介是不一样的,工作在物理层的是集线器。不过,大致可以为一下两类:

  • 引导型传输媒介:引导型传输媒体中又有不同的类别,比如同轴电缆、光缆、双绞线,其中双绞线根据是否屏蔽又可以继续细分。

  • 非引导型传输媒介:非引导型传输媒介指的是无线电波在空间中的传播,利用不同的频段可以传输不同的信号。

信道

说起信道,前面的基础篇提到过信道的利用率,但至于信道更详细的介绍,就没有提到,现在就来仔细看看。按照传输媒介可以分为三类:

  • 有线信道:有线信道以导线为传输媒质,信号沿导线进行传输,信号的能量集中在导线附近,因此传输效率高,但是部署不够灵活。这一类信道使用的传输媒质包括用电线传输电信号的架空明线、电话线、双绞线、对称电缆和同轴电缆等等,还有传输经过调制的光脉冲信号的光导纤维。
  • 无线信道:无线信道主要有以辐射无线电波为传输方式的无线电信道和在水下传播声波的水声信道等。无线电信号由发射机的天线辐射到整个自由空间上进行传播。不同频段的无线电波有不同的传播方式。
  • 存储信道:在某种意义上,磁带、光盘、磁盘等数据存储媒质也可以被看作是一种通信信道。将数据写入存储媒质的过程即等效于发射机将信号传输到信道的过程,将数据从存储媒质读出的过程即等效于接收机从信道接收信号的过程。

信道是传输信息的信道,信道容量描述了信道无差错地传输信息的最大能力,可以用来衡量信道的好坏。

关于信道,还有一个重要的参数,那就是信噪比,信噪比越大,信道的容量也越大,这里的话给出著名的香农公式:

其中,C为信道容量,B为带宽,S/N为信噪比。

信道复用

我们知道,当没有数据进行传输的时候,信道是十分空闲的。但是在网络数据请求量大的时候,比如说最近的618,信息的传播速度就会受阻。那什么是信道的复用,复用就是重复使用的意思。信道的复用可以分为以下几个方面:

  • 时分复用: 所谓的时分复用,就是把做整个信道分为不同的时间。当采用时分复用时,所有用户在不同的时间占用同样的频带宽度(分时不分频)。 时分复用可能会造成线路资源的浪费

  • 频分复用: 频分复用就是把信号分成不同的频率,当采用频分复用技术时,所有用户在同样的时间占用不同的带宽资源。当采用频分复用技术时,所有用户在同样的时间占用不同的带宽资源。

  • 统计时分复用:所谓的统计时分复用系统,我们也可以称为异步的时分复用系统。它有一个类似缓冲的机制,当数据到达一定量的时候,才会转发,这大大提高了信道的利用率。

数据链路层


以太网帧

数据链路层接收来自网络层的IP数据报,通过一定的封装,让IP数据报能在数据链路层上传输。像这样,装好了的IP数据报,我们称之为以太网帧,也叫MAC帧。MAC帧由以下几个重要的部分组成:

  • 目的MAC地址:MAC帧的目的地址占据6个字节,它标志了目标主机的地址。

  • 源MAC地址:和目的地址一样,源地址也占据6个字节,它标志的源主机的地址。

  • 类型:类型占据2个字节,它记录上层使用的协议0X0800表示IP协议。

  • 数据部分:数据部分自然是来自上层的IP数据报。

  • FCS:FCS占据4个字节,它是用来进行差错检测的,如果一个MAC帧发生了错误,则不能发送到目的主机上。

差错检测

为什么要进行差错检测?

现实的通信链路都不会是理想的。这就是说,比特在传输的过程中可能会产生差错:1可能会变成0,0可能会变成1,这就叫做比特差错。在一段是时间内,传输错误的比特占所传输比特总数的比率成为误码率BER(Bit Error Rate)。误码率与信噪比有很大的关系,在实际通信中不可能使误码率下降到零。 因此,为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。

MAC帧在传播的过程中会产生差错,差错的产生是不可避免的。前面在以太网帧部分我们提到过差错检测序列FCS,根据FCS我们就可以知道这个MAC帧在传输的过程中是否出现了错误或者丢失。

后面讲到传输层的时候我们也会提到差错检测,那么这两者到底有啥区别了?总结起来,可以用一句话概括:

  • 数据链路层的差错检测的目的是做到"无比特差错"。
  • 传输层的差错检测的目的是做到"无传输差错"。即弥补帧丢失、帧重复、帧失序。

差错检测的方法主要有两种:奇偶校验法(PCC)和循环冗余校验CRC,PCC非常简单,不是这篇文章的重点,下面主要讲一下CRC循环冗余校验。

循环冗余校验是一种根据传输或保存的数据而产生固定位数校验码的方法,主要用来检测或校验数据传输或者保存后可能出现的错误。生成的数字在传输或者储存之前计算出来并且附加到数据后面,然后接收端进行检验确定数据是否发生变化。

通过CRC,我们可以计算出FCS冗余校验码,FCS位于MAC帧的尾部。通过FCS,我们就可以知道这个MAC帧是否发送了错误。

适配器

说到适配器,其实完全可联想一下生活中的适配器。比如我们给手机充电的时候需要有电源适配器,电源适配器无非就是转换的作用,或者作为一个载体,实现能量的转移。实际上,电脑里的适配器也是一样。结合下面这张图来理解:

我们都知道,数据在外部媒介中的传输方式是串行传输,然而计算机处理内部指令的时候,用的是并行的方式。怎样把串行传输的数据转换成并行传输呢?这就需要适配器了。适配器就像是起到了桥梁的作用,通过它,就可以轻松实现数据传输方式的转换。

CAM表

我们都知道交换机,交换机是一种多端口的网桥,在数据链路层使用MAC地址转发数据。在交换机类不实际存储以一张表,叫做CAM表。这张表记录了主机的MAC地址以及对应的接口,看看下面的这张图:

有三台主机A,B,C和交换机连接在一起,最开始,CAM里没有存储任何信息。

突然有一天,主机A(源MAC)想要给主机B(目的MAC)发送消息。这个时候,交换机就会检查自己的CAM表里是否存储了主机A的信息,交换机一看没有A的信息,就把A的信息写进自己的CAM表里。现在,交换机的CAM表变成了这样:

这个时候,交换机的CAM表里已经存储了主机A的信息,但是主机A却想要给主机B发送信息。这可怎么办呢?首先,交换机会检查自己的CAM表里是否存在B的信息,如果存在,就直接把信息转发给B。如果不存在,那又怎么办呢?犹豫了一下,交换机又有了一个想法,它把主机A发给主机B的消息以广播的形式发给了所有连在它身上的主机。主机C也收到了这条消息,但是主机C检查了一下目的地址,不是发给自己的,就果断丢弃了这条消息。主机B收到了这条消息后,同样也检查了收件人(目的地址),发现是给自己的消息,于是就收下了这条消息。之后,交换机就更新了自己的CAM表,上面增加了一条信息:

就这样,CAM表里存储了主机A,和主机B的信息。下一次,主机A想要给主机B发送信息的时候,交换机就不需要广播了。

CSMA/CD协议

到目前为止CSMA/CD的使用已经相当少了,它的使用在下面两个地方:

  • 使用的是有线网络
  • 应用在10M/100M的半双工有线网络中

使用CSMA/CD协议的的网络有以下三个特点:

  • 该网络是总线结构,所有的计算机接在同一总线上,同一时间内,只允许一台计算机发送(或接收)消息,也就是采用半双工通信。
  • 载波监听:在发送前、发送中都要不停地对信道进行监听,只有在信道是空闲的时候才能发送消息。
  • 碰撞检测:主机会在发送消息前,发信息的过程中不断对进行信道检测,如果有两台主机同时发送消息,则消息传输立即停止。随机等待一段时间再进行发送消息,这就是退避算法。

补充一下退避算法的特点:

  • 非坚持的CSMA:线路忙,则等待一段时间,再监听;不忙时,立即发送;减少冲突,信道利用率降低
  • 1坚持的CSMA:线路忙,继续侦听;不忙时,立即发送;信道利用率提高,冲突增大。
  • P坚持的CSMA:线路忙,继续侦听;不忙时,根据p概率进行发送,另外的1-p概率为继续侦听(p是一个指定概率值)。

网络层


IP协议

IP的概述

IP协议对应的是IP地址,那么什么是IP地址呢?

维基百科上是这样解释的:

IP地址(英语:IP Address, 全称:Internet Protocol Address),又译为网际协议地址、互联网协议地址。当设备连接网络,设备将被分配一个IP地址,用作标识。通过IP地址,设备间可以互相通讯,如果没有IP地址,我们将无法知道哪个设备是发送方,无法知道哪个是接收方。[2] IP地址有两个主要功能:标识设备或网络 和 寻址(英语:location addressing)。

上面的一堆文字其实无非解释了两个点,总结如下:

  • IP地址是用来标记主机的地址,没有IP地址就无法识别主机。(标志主机)
  • 因为唯一标记主机,所以可以用来在网络中查找主机。(寻址)

现在想一下前面我们说到的MAC地址,MAC地址是一台主机的身份象征。一台主机从出厂以后,MAC地址就唯一确定了,无法更改(当然也可以通过软件修改,但是必须得确保同一局域网下不能有两台MAC地址相同的主机)。

那么,为什么有了MAC地址,还需要IP地址?或者说是有了IP地址,还需要MAC地址?

这其实也算是一个经典的问题了,网上也有不少答案,这里推荐两篇文章:

  • 有了 IP 地址,为什么还要用 MAC 地址?
  • 为什么有MAC地址,还要有IP地址??

看完上面两篇文章,我总结如下:

  • 历史原因: 以太网诞生于因特网之前,在IP地址之前MAC地址就已经在使用了。两者结合使用,是为了不影响已存在的协议
  • 分层实现: 对网路协议进行分层以后,数据链路层的实现不需要考虑数据之间的转发,网络层的实现不需要考数据链路层的影响。
  • 分工合作: IP地址是会随着主机接入网络的不同而发生改变的,而MAC一般不会改变。这样的话,我们可以使用IP地址进行寻址,当数据报和目的主机处于同一网络时,就使用MAC地址进行数据交付。

IP数据报

IP数据的样子是这样的:

有几个重要的东西必须得进行说明一下:

  • 版本号:占用4位二进制数,表示该IP数据报使用的IP协议版本。目前Internet中使用的主要是TCP/IP协议族中版本号为4的IP协议。
  • 头长度:占用4位二进制位,此域指出整个报头的长度(包括选项),该长度是以32位二进制数为一个计数单位的,接收端通过此域可以计算出报头在何处结束及从何处开始读数据。普通IP数据报(没有任何选项)该字段的值是5(即20个字节的长度)。
  • 服务类型:服务类型(TOS、type of service):占用8位二进制位,用于规定本数据报的处理方式。
  • 生存时间(TTL,Time To Live):占用8位二进制位,它指定了数据报可以在网络中传输的最长时间。实际应用中把生存时间字段设置成了数据报可以经过的最大路由器数。TTL的初始值由源主机设置(通常为32、64、128或256),一旦经过一个处理它的路由器,它的值就减1。当该字段为0时,数据报就丢弃,并发送ICMP报文通知源主机,因此可以防止进入一个循环回路时,数据报无休止地传输下去。
  • 上层协议标识:占用8位二进制位,IP协议可以承载各种上层协议,目标端根据协议标识就可以把收到的IP数据报送到TCP或UDP等处理此报文的上层协议了。

关于IP数据报相对详细的文章可以看看这篇文章:IP数据报格式详解

子网掩码与IP地址

前面说到IP地址的组成的时候,说到过网络号。常见的IP地址无非就是由网络地址和主机地址组成。那么什么是网络号?网络号就是计算机当前所在网络的名字,在这个网络下,又由许多的主机构成。那又该怎么计算网络号了?这时候,子网掩码派上了用场。

通常,计算机的IP地址和子网掩码是成对出现的,通过子网掩码和IP地址进行对照就可以知道主机号和网络号。为了方便表示,子网掩码前面通常是连续的1,后面部分是连续的0,不能出现0和1交替的情况。

请看下面的例子。

现在已经知道了主机A的IP地址和子网掩码,把它们转化成二进制的形式。通过二进制对应子网掩码的1的部分对应IP地址的网络号,子网掩码为0的部分对应主机号。下面的这张图画的很清楚:

ICMP协议

我们知道,IP协议是不可靠的传输协议,网络中进行可靠传输的是TCP协议,这个后面在讲传输层的时候会说到。那么,如果在消息没有送达的情况下,网络层是怎么解决的了?这个时候,就需要用到ICMP协议。什么是ICMP协议了?ICMP是网络控制报文协议(Internet Control Message Protocol, ICMP)。

它的作用:更加有效地转发IP数据报作为IP数据报的数据部分,可以分为ICMP差错报文,和ICMP查询报文。差错报文是用来简单的报告错误的, 至于对于错误怎么处理是高层协议的职责。 同时, 差错报文总是发送给最初的数据源(这是因为在ICMP数据报中唯一可以使用的就是源IP和目的IP),查询报文总是成对出现。

ARP协议

前面说到IP地址用来寻址,当目的地址和数据报处于同一网络时,MAC地址用来交付数据报。现在有一个问题,主机A要给主机B发送消息,消息经过一系列地转发,终于找到了主机B的IP地址。但是,我们都知道,数据在链路层的传输是需要MAC地址的,仅仅知道B的IP地址是无法进行通信的。请看下面这张图:

这个时候,ARP协议就派上用场了。ARP全称是地址解析协议(Address Resolution Protocol),其基本功能为透过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行,它是IPv4中网络层必不可少的协议。

如同交换机工作在数据链路层一样,路由器是工作在网络层的。交换机有CAM表,路由器也有路由表。

现在路由器要给主机B发送一条消息,必须得知道主机B的MAC地址才能进行通信。这个时候路由器会发送一个ARP请求,该请求是以广播的形式发送的,每一台连接到该路由器的主机都收到得到这条消息。但是只有主机B检查到自己的IP地址符合要求。于是主机B发送给路由器一条ARP响应,把自己的MAC的地址告诉了路由器。就像下面图示的那样:

每次路由器发送一个ARP请求的时候,就会增加一条数据,这一条数据记录了IP地址对应的MAC地址,这样路由器下次再给该主机发送消息的时候就不用广播了。当然如同交换机的CAM表中的数据有生存了时间一样,路由表中的数据也有生存时间。试想一下,如果数据一直存在,那么路由器岂不是需要花大量的存储空间来缓存已经失效的数据。

内部网关协议

互联网的路由选择协议主要有两种,分别是RIP和OSPF。下面具体介绍这两种协议。

先介绍RIP协议

  • 路由信息协议(RIP) 是内部网关协议IGP中最先得到广泛使用的协议。RIP是一种分布式的基于距离矢量的路由选择协议,是因特网的标准协议,其最大优点就是实现简单,开销较小。
  • 基本算法:矢量距离算法(简称V-D算法)的思想是:网关周期性地向外广播路径刷新报文,主要内容是由若干(V,D)序偶组成的序偶表;(V,D)序偶中的V代表“向量”,标识网关可到达的信宿(网关或主机),D代表距离,指出该网关去往信宿V的距离;距离D按驿站的个数计。其他网关收到某网关的(V,D)报文后,据此按照最短路径原则对各自的路由表进行刷新。
  • 它只适用于小型的网络(15跳就达到极限),如果网络过于庞大,当网络出现故障时,要经过比较长的时间才能将此信息传送到所有的路由器。

接下来说说什么是OSPF:

  • 基本定义:OSPF(Open Shortest Path First开放式最短路径优先)是一个内部网关协议(Interior Gateway Protocol,简称IGP),用于在单一自治系统(autonomous system,AS)内决策路由。
  • 基本算法:迪克斯加算法。 主要是通过向邻居发送HELLO包来建立邻居关系,选取DR等。

参考文章:计算机网络原理之RIP以及OSPF对比

NAT协议

NAT技术其非常简单,那么NAT它的作用是什么呢?

NAT(Network Address Translation,网络地址转换)是1994年提出的。当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但现在又想和因特网上的主机通信(并不需要加密)时,可使用NAT方法。

这种方法需要在专用网连接到因特网的路由器上安装NAT软件。装有NAT软件的路由器叫做NAT路由器它至少有一个有效的外部全球IP地址。这样,所有使用本地地址的主机在和外界通信时,都要在NAT路由器上将其本地地址转换成全球IP地址,才能和因特网连接。另外,这种通过使用少量的公有IP 地址代表较多的私有IP 地址的方式,将有助于减缓可用的IP地址空间的枯竭

简单来说,NAT技术就是实现局域网与互联网通信的一项协议。 NAT又可以分为三种不同的类型:

  • 静态NAT(Static NAT): 静态NAT设置起来最为简单和最容易实现的一种,内部网络中的每个主机都被永久映射成外部网络中的某个合法的地址。当一个内部主机必须被作为一个固定的外部地址访问时,通过静态NAT实现。

  • 动态地址NAT(Pooled NAT): 动态NAT则是在外部网络中定 义了一系列的合法地址(地址池),采用动态分配的方法映射到内部网络。动态NAT转换的工作过程是这样的,当有一个内部主机需要访问外网时,从公用IP地址池中取出一个可用的地址分配给该主机使用。当通信完成后,所获取的公用IP地址也被释放回地址池中。外部公用IP在被分配给一个内部主机通信使用时,该地址不能不能再次被分配给其他内部主机使用。

  • 网络地址端口转换NAPT(Port-Level NAT): NAPT是把内部地址映射到外部网络的一个IP地址的不同端口上。NAPT(Network Address Port Translation),即网络端口地址转换,可将多个内部地址映射为一个合法公网地址,但以不同的协议端口号与不同的内部地址相对应,也就是<内部地址+内部端口>与<外部地址+外部端口>之间的转换。

参考文章【计算机网络】NAT:网络地址转换

IPV6协议

我们前面说的IP地址其实是IPV4,那么,为什么已经有IPIV4了,还要来一个IPV4呢?原来是这样的,早在上个世纪,人们就预料到IPV4地址枯竭的一天,为了解决这个问题,开始了IPV6的研发。

IPv6 (IP version 6)是为了根本解决IPv4地址耗尽的问题而被标准化的网际协议。 IPv4的地址长度为4个8位字节,即32比特。而IPv6的地址长度则是原来的4倍,即128比特,一般写成8个16位字节。可以看到,IPV6的地址是取之不尽,用之不竭的,那么现在为什么不把IPV4全部换成IPV6呢?

从IPV4切换到IPV6极其耗时,需要将网络中所有主机和路由器的IP地址进行重新设置。当互联网广泛普及后,替换所有IP地址会是更为艰巨的任务。

在现存的网络中,既有IPV4又有IPV6,那么它们之间是怎么通信的呢?有两种技术:双协议栈隧道技术,下面分别进行介绍:

  • 双协议栈:改变IP地址的首部,在首部进行转换的过程中,IPV6的首部的部分信息会丢失,而且这种转换的损失不可避免。
  • 隧道技术:何谓隧道技术了?其实完全可以通过字面的意思理解。下面还是以画图的方式帮助大家理解。隧道技术说白了就是数据在传输的时候进行了另一种的封装与解封,如图数据由IPV6网络进入到IPV4的网络,需要把IPV6的数据包封装在IPV4的数据包里。

传输层


停止等待协议

什么是停止等待协议了?看完下面一张图你可能就懂了

停止等待协议可以由以下三个部分组成:

  • 无差错情况:就像上面那个图一样,为了保证无差错的情况,主机A还要继续向主机B发送消息,就必须得到主机B的回复。
  • 出现差错:如果出现差错,比如主机A一直没有收到主机B的回复,那么就会有一种机制,使得主机A把这条消息再一次发送给主机B。这中间涉及到一个重传时间的选择,这里得话,这个重传时间应该不小于RTT(主机A给主机B发送消息,主机B再给主机A发送消息的时间和)。
  • 确认丢失和确认迟到:确认迟到和确认丢失,看看下面的这张图你可能就明白了

数据在传输过程中可能会出现丢失和迟到的情况,对于丢失的数据进行重传,对于迟到的数据不做处理。既然说到了停止等待协议,那我就不得不补充一下ARQ协议。是什么ARQ协议了?

ARQ协议就是发送方不必收到对上一条消息的确认,一次可以发出多个分组,这样就提高了信道的利用,可以在某一时间内传送足够的数据量。

UDP

UDP协议相对与TCP协议来说是相当简单的,传输层的重点自然也是TCP协议。下面先简单解释一下UDP协议。

UDP具有以下特点:

  • 面向无连接的协议,进行不可靠的传输
  • 面向数据报
  • 没有拥塞控制
  • UDP数据报首部开销小
  • 支持一对一,一对多,多对多,多对一的数据传输

TCP

TCP概述

TCP是传输层的另一个协议,它具有以下特点:

  • TCP协议是面向连接的传输层协议
  • 提供可靠交付
  • 使用全双工通信
  • 面向字节流

TCP数据报

请看下面的这张图片(图片来源于网络)。

这里的话对数据报的某些字段作一下解释:

  • 源端口:发送主机的端口号
  • 目的端口:接收主机的端口号
  • 序号:在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。字节流的起始序号必须在连接建立时设置。TCP数据报首部中的序号字段值则指的是本报文段所发送的数据的第一个字节的序号。
  • 确认号:即期望收到对方下一个报文段的第一个数据字节的序号。若确认号为N,则表明:到序号N-1为止的所有数据都已正确收到。
  • 数据偏移:它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。
  • 窗口:窗口字段明确指出了现在允许对方发送的数据量。窗口值经常在动态变化着 窗口指的是发送本报文段的一方的接收窗口(而不是自己的发送窗口)。
  • 校验和:检验和字段检验的范围包括首部和数据这两部分 在计算检验和时,要在TCP报文段的前面加上12字节的伪首部(同UDP)
  • 确认ACK:仅当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置1。
  • 推送PUSH:当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应,而不再等到整个缓存都填满了后再向上交付。这时,发送方TCP把PSH置1,并立即创建一个报文段发送出去。接收方TCP收到PSH=1的报文段,就尽快地(即“推送”向前)交付接收应用进程。
  • 复位RST :当RST=1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
  • SNY:在连接建立时用来同步序号 当SYN=1而ACK=0时,表明这是一个连接请求报文段。
  • FIN:用来释放一个连接。

滑动窗口

TCP进行数据发送,为了提高数据传输的效率,采用了一种叫做滑动窗口的机制来进行数据发送。

下面是发送端滑动窗口的示意图,滑动窗口的大小是绿色部分和红色部分的序列长度。它工作的机制是这样的,一旦发送端收到一个确认,滑动窗口就会向右移动。

流量控制

关于流量控制,用一句简短的话就可以概括。

接收端会给发送端一个负反馈,通过这个负反馈可以控制发送端的滑动窗口的大小。

下面可以看一下知乎上是怎么说的,我找了一条讲的最形象,可以结合着理解一下。

知乎:TCP协议的滑动窗口具体是怎样控制流量的?

拥塞控制

  • 慢启动: 慢启动值得就是一条TCP链接刚建立时不要一下发送大量数据导致网络拥塞激增,而是由小到大根据反馈逐渐增大拥塞窗口。

  • 拥塞避免: 拥塞避免就是让滑动窗口缓慢增大,而不是像慢开始那样成倍增长。

  • 快重传: 发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器到期。

  • 快恢复: 快恢复具有下面两个特点

    • 当发送方连续收到三个重复确认时,就执行 “乘法减小” 算法,把慢开始门限减半。这是为了预防网络发生拥塞。注意,接下去不执行慢开始算法。
    • 执行快恢复算法时,改变滑动窗口的值,然后开始执行拥塞避免算法,使得拥塞窗口缓慢性增大。

三次握手

三次握手与四次挥手可以说是面试常考的知识点了,不过在介绍三次握手之前,我觉得有必要了解一下理想传输条件的共性

  • 传输信道不产生差错
  • 不管发送方以多快的速度发送数据,接收方总是能够及时接收数据。

理想的情况终究是理想的,上述两种情况在实际环境是不可能发生的。那么,我们就来说说怎样使得我们的实际情况更加接近理想,这就是我们接下来要讲的三次握手。

首先,三次握手和后面要讲的四次挥手都是针对TCP来说的,UDP是面向无连接的协议,不可能存在的三次握手与四次挥手。三次握手与四次挥手是为了更好进行可靠的传输,下面先看下面三次握手的流程图。

既然是为了进行可靠的传输,无非是要保证客户端与服务器之间的数据发送和接收的正常进行。

  • 第一次握手:Client 什么都不能确认;Server 确认了Client发送正常。
  • 第二次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己接收正常,Client发送正常。
  • 第三次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己发送、接收正常,对方发送接收正常。

为什么需要进行第三次握手了?一句话,主要防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。

通过上面的三个步骤,Client和Server能够进行可靠的传输,缺一不可。

四次挥手

既然理解了三次握手,想必四次挥手也没有啥难度,先把流程图附上。

如同三次挥手一样,四次挥手也是为了可靠的传输。四次挥手就是Client和Server断开连接的过程,那么你可能会觉得,建立连接的过程需要三次到还可以理解,为啥连断开连接都需要四次。难道一次或者两次就不可以了吗?

是这样的,既然三次握手的需要发送方和接收方确认,那么四次挥手也要得到发送方和接收方的确认。

  • 第一次挥手:Client向Server发送断开的连接的请求。
  • 第二次挥手:Server向Client发送断开连接的确认。Client收到以后,这个时候TCP进入了半连接的状态,从Client向Server发送数据的通道被关闭了。
  • 第三次挥手:Server向Client发送一个断开连接的请求。
  • 第四次挥手:Client向Server发送断开连接的确认。Server收到以后,这个时候TCP连接就完全断开了。

也可以这样考虑,上面提到的问题。假如在第二次挥手的时候,Server在给Client发送ACK的同时,也发送了FIN的请求。那么如果,Server还在接收从Client传输过来的数据,则会因为Client的下一个ACK而关闭接收数据的通道,数据就会接收失败就像下面的这个图那样。

这里推荐一篇文章,帮助大家更好理解TCP连接地建立和断开的过程:两张动图-彻底明白TCP的三次握手与四次挥手

TCP与UDP的应用场景

至于TCP与UDP的关系,看完下面的这张图你可能就懂了(图片来源于网络):

TCP是可靠的传输,UDP是不可靠的传输,那为什么我们还需要使用不可靠的UDP进行数据传输呢?

我们知道,UDP 在传送数据之前不需要先建立连接,远地主机在收到 UDP 报文后,不需要给出任何确认。虽然 UDP 不提供可靠交付,但在某些情况下 UDP 确是一种最有效的工作方式(一般用于即时通信),比如: QQ 语音、 QQ 视频 、直播等等。

TCP 提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。 TCP 不提供广播或多播服务。由于 TCP 要提供可靠的,面向连接的运输服务(TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源),这一难以避免增加了许多开销,如确认,流量控制,计时器以及连接管理等。这不仅使协议数据单元的首部增大很多,还要占用许多处理机资源。TCP 一般用于文件传输、发送和接收邮件、远程登录等场景。

应用层


HTTP协议

关于HTTP的定义,可以看一下维基百科上是怎么说的:

在网页浏览器的地址栏上显示HTTP网络协议的插图 HTTP是一个客户端(用户)和服务端(网站)之间请求和应答的标准,通常使用TCP协议。通过使用网页浏览器、网络爬虫或者其它的工具,客户端发起一个HTTP请求到服务器上指定端口(默认端口为80)。我们称这个客户端为用户代理程序(user agent)。应答的服务器上存储着一些资源,比如HTML文件和图像。我们称这个应答服务器为源服务器(origin server)。

http协议现在已经广泛用于万维网,关于http,后面单独那个文章出来讲,不过现在得先说一下https。

其实http和https是一种协议,只不过https经过了SSL(Secure Socket Layer,安全套接字层)或TLS(Transport Layer Security,传输层安全)的封装。单从这两个协议就可以知道,https安全的,而http是不安全的。

FTP协议

FTP(File Transfer Protocol)文件传输协议,在TCP/IP协议族中属于应用层协议运行于TCP协议之上是一种可靠的传输协议,主要功能用于实现用户间文件分发共享,以及网络管理者在进行设备版本升级、日志下载和配置保存等业务操作时,均会使用到FTP功能。

DNS协议

前面说到IP地址是用来定位主机的,但是我们在生活中是很难记住这些没有规律的IP地址,我们只知道网站的域名。那现在要怎么办了?

于是DNS协议出现了。

DNS是域名解析协议,假如我们知道了域名,但是不知道服务器的IP地址,就需要用到DNS协议。

DHCP协议

什么是DHCP协议了?还是看看维基上的定义

动态主机设置协议(DHCP)是一种使网络管理员能够集中管理和自动分配IP网络地址的通信协议。在IP网络中,每个连接Internet的设备都需要分配唯一的IP地址。DHCP使网络管理员能从中心结点监控和分配IP地址。当某台计算机移到网络中的其它位置时,能自动收到新的IP地址。

维基上已经解释的非常清楚了,DHCP的作用就是动态地给主机分配IP地址,大大减少了网络管理员的工作负担。



这篇关于三天两夜肝完这篇万字长文,终于拿下了TCP/IP的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程