浅谈TCP/IP

TCP/IP四层协议系统

1) 链路层,有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。

2) 网络层,有时也称作互联网层,处理分组在网络中的活动,例如分组的选路。在TCP/IP协议族中,网络层协议包括IP协议(网际协议),ICMP协议(Internet互联网控制报文协议),以及IGMP协议(Internet组管理协议)。

3) 运输层主要为两台主机上的应用程序提供端到端的通信。在TCP/IP协议族中,有两个互不相同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。

  • TCP为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节
  • UDP则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必需的可靠性必须由应用层来提供
4) 应用层负责处理特定的应用程序细节。几乎各种不同的TCP/IP实现都会提供下面这些通用的应用程序:
  • Telnet 远程登录。
  • FTP 文件传输协议。
  • SMTP 简单邮件传送协议。
  • SNMP 简单网络管理协议
浅谈TCP/IP_第1张图片

链路层

Internet协议族中的最底层协议,链路层协议
在TCP/IP协议族中,链路层主要有三个目的:
  • 为IP模块发送和接收IP数据报
  • 为ARP模块发送ARP请求和接收ARP应答
  • 为RARP发送RARP请求和接收RARP应答
TCP/IP支持多种不同的链路层协议,这取决于网络所使用的硬件,如以太网、令牌环网、FDDI(光纤分布式数据接口)及RS-232串行线路等

以太网链路层协议 , 两个串行接口链路层协议 ( S L I P 和 P P P ), 以及大多数实现都包含的环回( l o o p b a c k )驱动程序

SLIP:串行线路IP

它是一种在串行线路上对IP数据报进行封装的简单形式,下面的规则描述了SLIP协议定义的帧格式:
  • IP数据报以一个称作END( 0xc0)的特殊字符结束,同事为了防止数据报到来之前的线路噪声被当成数据报内容,大多数实现在数据报的开始出也传一个END字符(如果有线路噪声,那么END字符将技术这份错误的报文,这样当前的报文得以正确的传输,而前一个错误报文交给上层后,会发现其内容毫无意义而被丢弃)
  • 如果IP报文中某个字符为END,那么就要连续传输两个字节0xdb和oxdc来取代它。oxdb这个特殊字符被称作SLIP的ESC字符
  • 如果IP报文中的某个字符为SLIP的ESC字符,那么就要连续传输两个字节0xdb和oxdd来取代它
SLIP是一种简单的帧封装方法,其中有一些缺陷:
  • 每一端必须知道对象的IP地址,没有办法把本端的IP地址通知给另一端
  • 数据帧中没有类型字段,如果一条串行线路用于SLIP,那么它不能同时使用其他协议
  • SLIP没有再数据帧中加上检验和,如果SLIP传输的报文被线路噪声影响而发生错误,只能通过上层协议来发现(另一种方法是新型的调制解调器可以检测并纠正错误报文)
尽管存在这些缺点, SLIP仍然是一种广泛使用的协议

PPP:点对点协议

PPP点对点协议修改了SLIP协议中的所有缺陷,PPP包括以下三个部分:
  • 1 ) 在串行链路上封装IP数据报的方法。PPP既支持数据为8位和无奇偶检验的异 步模式 (如大多数计算机上都普遍存在的串行接口),还支持面向比特的同步链接
  • 2) 建立、配置及测试数据链路的链路控制协议( LCP : LinkControlProtocol )。它允许通信双方进行协商,以确定不同的选项
  • 3) 针对不同网络层协议的网络控制协议( NCP : NetworkControlProtocol )体系。当前RFC定义的网络层有IP、OSI网络层、DECnet以及AppleTalk
PPP比SLIP具有下面这些优点:
  • PPP支持在单根串行线路上运行多张协议,不只是IP协议
  • 每一帧都有循环冗余检验
  • 通信双方可以进行IP地质的动态协商(使用IP网络控制协议)
  • 与CSLIP类似,对于TCP和IP报文首部进行压缩
  • 链路控制协议可以对多个数据链路选项进行设置
为这些优点付出的代价是在么一帧的首部增加3个字符,当建立链路时要发送几帧协商数据,以及更为复杂的实现

环回接口

大多数的产品都支持环回接口( Loopback Interface),以允许运行在同一台主机上的客户程序和服务器程序通过TCP/IP进行通信

A类网络号127就是为环回接口预留的,根据惯例,大多数系统把IP地址127.0.0.1分配给这个接口,并命名为localhost

一个传给环回接口的IP数据报不能再任何网络上出现:一旦传输层检测到目的端地址是环回地址时,应该可以省略部分传输层和所 有网络层的逻辑操作。但是大多数的产品还是照样完成传输层和网络层的所有过程,只是当I P 数据报离开网络层时把它返回给自己

下图为环回接口处理IP数据报的过程
浅谈TCP/IP_第2张图片
图中需要指出的关键点是:

  • 1) 传给环回地址(一般是127.0.0.1 )的任何数据均作为IP输入
  • 2) 传给广播地址或多播地址的数据报复制一份传给环回接口,然后送到以太网上
  • 3) 任何传给该主机IP地 址的数据均送到环回接口

最大传输单元MTU

以太网和802.3对数据帧的长度都有一个限制,其最大值分别是1500和1492字节。链路层的这个特性称作MTU,最大传输单元,不同类型的网络大多是都有一个上限

如果IP层有一个数据报要传,而且数据的长度比链路层的MTU还大,那么IP层就需要进行分片,把数据报分成若干片,这样每一片都小于MTU

点到点的链路层(如SLIP和PPP)的MTU并非指的是网络媒体的物理特性。相反,它是一个逻辑限制,目的是为交互使用提供足够快的响应时间

IP:网际协议

在网络中,每台计算机都有一个唯一的地址,方便别人找到它,这个地址称为IP地址
IP是TCP/IP协议族中最为核心的协议,所有的TCP/UDP/ICMP及IGMP数据都以IP数据报格式传输

IP提供不可靠、无连接的数据报传送服务:

  • 不可靠( u n r e l i a b l e)指的是它不能保证 I P 数据报能成功地到达目的地。 IP提供最好的传输服务
  • 如果发生某种错误时,如某个路由器暂时用完了缓冲区,IP有一个简单的错误吹算法:丢弃该数据报,然后发送ICMP消息报给信源端
  • 任何要求的可靠性必须由上层来提供(如TCP)
  • 无连接指的是IP并不维护任何关于后续数据报的状态信息。每个数据报的处理是相互独立的
  • IP数据报可以不按顺序接收,如果一信源向相同的信宿发送两个连续的数据报(先是A然后是B),每个数据报都是独立地进行路由选择,可能选择不同的路线,因此B可能在A到达之前先到达

IP首部

普通的IP首部长为20个字节,除非含有选项字段
IP数据报格式及首部中的各字段,如图所示:
浅谈TCP/IP_第3张图片
  • 最高位在左边,记为0bit,最低位在右边,记为31bit
  • 版本:目前的协议版本号是4,因为IP有时也称作IPV4
  • 首部长部:首部占32bit字的数目,包括任何选项。由于它是一个 4比特字段,因此 首部最长为60个字节
  • 服务类型:包括一个3bit的优先权子字段(现在已被忽略),4bit的TOS子字段和1bit未用位必须置0,4bit的TOS分别代表:最小时延、最大吞吐量、最高可靠性和最小费用,4bit中只能置其中1bit
  • 总长度:该字段用以指示整个IP数据包的长度,最长为65535字节,包括头和数据
  • 标识符:唯一标识主机发送的每一份数据报
  • 标志:分为3个字段,依次为保留位、不分片位和更多片位

    • 保留位:一般被置为0
    • 不分片位:表示该数据报是否被分片,如果被置为1,则不能对数据报进行分片,如果要对其进行分片处理,就应将其置为0
    • 更多片位:除了最后一个分片,其他每个组成数据报的片都要将该位置设置为1.
  • 段偏移量:该分片相对于原始数据报开始处位置的偏移量
  • TTL(Time to Live生存时间):该字段用于表示IP数据包的生命周期,可以防止一个数据包在网络中无限循环地发下去。TTL的意思是一个数据包在被丢弃之前在网络中的最大周转时间。该数据包经过的每一个路由器都会检查该字段中的值,当TTL的值为0时此数据包会被丢弃。TTL对应于一个数据包通过路由器的数目,一个数据包每经过一个路由器,TTL将减去1
  • 协议号:用以指示IP数据包中封装的是哪个协议
  • 首部校验和:检验和是16位的错误检测字段。目的主机和网络中的每个网关都要重新计算报头的校验和,如果首部在传输过程中没有发生任何差错, 那么接收方计算的结果应该为全1,如果结果不是全1(即检验错误),那么IP久丢弃收到的数据报,但是不生成差错报文,由上层去发现数据并进行重传
  • 源IP地址:该字段用于表示数据包的源地址,指的是发送该数据包的设备的网络地址
  • 目标IP地址:该字段用于表示数据包的目标的地址,指的是接收节点的网络地址
  • 任选项:是数据报中的一个可变长的可选信息,选项字段一直都是以32bit作为接线,在必要时插入值为0填充字节,这样保证IP首部始终是32bit的整数倍

IP路由选择

大多数主机采用的IP路由选择机制:
  • 如果目的主机与源主机直接相连(如点对点链路)或都在一个共享网络上(以太网或令牌环网),那IP数据报就直接送到目的主机上,否则主机把数据报发往一默认的路由器上,由路由器来转发该数据报
路由表中的每一项都包含下面这些信息:
  • 目的IP地址:它既可以是一个完整的主机地址,也可以是一个网络地址,由该表目中的标志字段来指定
  • 标志:其中一个标志指明目的IP地址是网络地址还是主机地址,另一个标志指明下一站路由器是否为真正的下一站路由器还是一个直接相连的接口
  • 为数据报的传输指定一个网络接口
IP路由选择是逐跳地进行的,IP并不知道到达任何目的地的完整路径(除了那些鱼主机直接相连的目的),所有的IP路由选择只为数据报传输提供下一站路由器的IP地址,它假定下一站路由器比发送数据报的主机更接近目的,而且下一站路由器与该主机是直接相连的

IP路由选择主要完成以下这些功能:

  • 1) 搜索路由表,寻找能与目的IP地址完全匹配的表目(网络号和主机号都要匹配) ,如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口(取决于标志字段的值)
  • 2) 搜索路由表,寻找能与目的网络号相匹配的表目。如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口(取决于标志字段的值)。目的网络上的所有主机都可以通过这个表目来处置
  • 3) 搜索路由表 , 寻找标为“默认(default )” 的表目。如果找到 , 则把报文发送给该表目指定的下一站路由器
如果上面这些步骤都没有成功,那么该数据报就不能被传送。如果不能传送的数据报来自本机,那么一般会向生成数据报的应用程序返回一个“主机不可达”或“网络不可达”的错误

为一个网络指定一个路由器,而不必为每个主机指定一个路由器,这是IP路由选择机制的另一个基本特性。这样做可以极大地缩小路由表的规模,比如Internet上的路由器有只有几千个表目,而不会是超过100万个表目

IP地址的分类

IP地址的网络部分是由Internet地址分配机构来统一分配的,这样可以保证IP的唯一性
  • ip地址中全为1的ip即255.255.255.255,它称为限制广播地址,如果将其作为数据包的目标地址可以理解为发送到所有网络的所有主机
  • ip地址中全为0的ip即0.0.0.0,它表示启动时的ip地址,其含义就是尚未未分配时的ip地址
  • 127是用来进行本机测试的,除了127.255.255.255外,其它的127开头的地址都代表本机
浅谈TCP/IP_第4张图片
如图所示,红色为网络部分,绿色为主机部分

子网寻址

现在所有的主机都要求支持子网编址

  • 如果把IP看成单纯的一个网络号和一个主机号组成,A类和B类地址为主机号分配了太多的空间,可容纳的主机数分别为 2^24-2 和 2^16-2(除了全 0 和全 1),然而一个网络中人们并不安排这么多的主机
  • 现在把主机号再分成一个子网号和一个主机号,如对一个 B 类地址,前 16 位为网络号,将后 16 位主机号拆分为 8 位子网号和 8 为主机号。子网对外部路由器来说隐藏了内部网络组织(校园或公司内部)的细节。这样外部路由器仅需要知道下一跳路由的子网号,而无需知道具体的主机号,可以大大缩减路由表的规模

子网掩码

子网掩码(subnet mask)又叫子网络遮罩,它是一种用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机位的掩码。 子网掩码不能单独存在,它必须结合IP地址一起使用。 子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分
  • 子网掩码也是32个二进制位
  • 对应IP的网络部分用1表示
  • 对应IP地址的主机部分用0表示
  • IP地址和子网掩码做逻辑与运算得到网络地址

    • 0和任何数相与都是0
    • 1和任何数相与都等于任何数本身
两种不同的B类地址子网掩码的例子,如图:
浅谈TCP/IP_第5张图片

A B C 三类地址都有自己默认的子网掩码

  • A类 255.0.0.0
  • B类 255.255.0.0
  • C类 255.255.255.0
给定IP地址和子网掩码后,主机就可以确定IP数据报的目的是:
  • 本子网上的主机
  • 本网络中其他子网中的主机
  • 其他网络上的主机

TCP:传输控制协议

TCP提供一种面向连接的、可靠的字节流服务
TCP提供全双工服务,即数据可在同一时间双向传播

面向连接指的是两个使用TCP的应用(通常是客户端和服务端)在彼此交换数据之前必须先建立一个TCP连接,保证双向的接收和发送都是正常的

TCP通过下列方式来提供可靠性:

  • 应用数据被分割成TCP认为最适合发送的数据块,由TCP传递给IP的信息单位成为报文段或段(Segment)
  • 当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段,如果不能及时收到一个确认,将重发这个报文段
  • 当TCP收到发自TCP连接另一端的数据,它将发送一个确认,这个确认不是立即发送,通常将推迟几分之一秒
  • TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错, TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)
  • 既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序,如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层
  • 既然IP数据报会发生重复, TCP的接收端必须丢弃重复的数据
  • TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据,这将方式较快主机致使较慢主机的缓冲区溢出

TCP数据包封装

浅谈TCP/IP_第6张图片
源端口号和目标端口号,计算机通过端口号识别访问哪个服务,比如http服务或ftp服务,发送方端口号是进行随机端口,目标端口号决定了接收方哪个程序来接收
  • 源端口号:发送TCP进程对应的端口号
  • 目标端口号:目标端接收进程的端口号
32位序列号:0~2^32-1范围内,32位序列号 TCP用序列号对数据包进行标记,以便在到达目的地后重新重装,假设当前的序列号为 s,发送数据长度为 l,则下次发送数据时的序列号为 s + l。在建立连接时通常由计算机生成一个随机数作为序列号的初始值

32位确认号:0~2^32-1范围内,对发送端的确认信息,告诉发送端这个序号之前的数据段都收到了。确认应答号,它等于下一次应该接收到的数据的序列号。假设发送端的序列号为 s,发送数据的长度为 l,那么接收端返回的确认应答号也是 s + l。发送端接收到这个确认应答后,可以认为这个位置以前所有的数据都已被正常接收

首部长度:TCP 首部的长度,单位为 4 字节。如果没有可选字段,那么这里的值就是 5。表示 TCP 首部的长度为 20 字节

控制位:TCP的连接、传输和断开都受这六个控制位的指挥

  • PSH(push急迫位) 缓存区将满,立刻传输速度
  • RST(reset重置位) 连接断了重新连接
  • URG(urgent紧急位) 紧急信号。只在 URG(urgent紧急) 控制位为 1 时有效。表示紧急数据的末尾在 TCP 数据部分中的位置。通常在暂时中断通信时使用(比如输入 Ctrl + C)
  • ACK(acknowledgement 确认)为1表示确认号。确认序列号有效位,表明该数据包包含确认信息
  • SYN(synchronous建立联机) 同步序号位 TCP建立连接时要将这个值设为1,为1时,请求建立连接
  • FIN发送端完成位,提出断开连接的一方把FIN置为1表示要断开连接,为1时,数据报送完毕,请求断开连接
窗口值:说明本地可接收数据段的数目,这个值的大小是可变的。当网络通畅时将这个窗口值变大加快传输速度,当网络不稳定时减少这个值可以保证网络数据的可靠传输。它是来在TCP传输中进行流量控制的

窗口大小:用于表示从应答号开始能够接受多少个 8 位字节。如果窗口大小为 0,可以发送窗口探测

16位校验和:主要用来实现差错控制的,TCP校验和的计算包括TCP首部、数据和其它填充字节。在发送TCP数据段时,由发送端计算校验和,当到达目的地时又进行一次检验和计算。如果两次校验 和一致说明数据是正确的,否则 将认为数据被破坏,接收端将丢弃该数据

TCP的三次握手

为了建立一条TCP连接,经过以下过程:
浅谈TCP/IP_第7张图片
  • 第一次握手主机A通过一个标识为SYN标识位的数据段发送给主机B请求连接,通过该数据段告诉主机B希望建立连接,需要B应答,并告诉主机B传输的起始序列号
  • 第二次握手是主机B用一个确认应答ACK和同步序列号SYNC标志位的数据段来响应主机A,一是发送ACK告诉主机A收到了数据段,二是通知主机A从哪个序列号做标记。
  • 第三次握手是主机A确认收到了主机B的数据段并可以开始传输实际数据。
这三个报文段完成连接的建立,这个过程也称为三次握手

TCP的四次挥手

建立一个连接需要三次握手,而终止一个连接要经过 4次握手,这是TCP的半关闭造成的
  • 一个TCP连接是全双工(即数据在两个方向上能同时传递),因此每个方向必须单独地进行关闭。这原则就是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的链接,当一端收到一个FIN,它必须通知应用层另一端已经终止了那个方向的数据传送,发送FIN通常是应用层进行关闭的结果
  • 收到一个FIN只意味着在这一方向上没有数据流动。一个TCP 连接在收到一个FIN后仍能发送数据
  • 首先进行关闭的一方(即发送第一个FIN )将执行主动关闭,而另一方(收到这个FIN) 执行被动关闭。通常一方完成主动关闭而另一方完成被动关闭
浅谈TCP/IP_第8张图片
  • 客户端发送FIN控制位发出断开连接的请求,用来关闭从客户端到服务器的数据传送
  • 当服务器收到这个FIN ,它发回一个ACK ,确认序号为收到的序号加 1 。和SYN 一样,一个FIN将占用一个序号
  • TCP服务器还向应用程序 (即丢弃服务器)传送一个文件结束符,接着这个服务器程序就关闭它的连接
  • 客户端确认收到服务器的关闭连接请求,发回一个确认,并将确认序号设置为收到序号加1
这样就终止一个连接的典型握手顺序,图中,发送FIN将导致应用程序关闭它们的链接,这些FIN和ACK是由TCP软件自动产生的

连接通常是由客户端发起的,这样第一个SYN从客户端传到服务器,每一端都能主动关闭这个连接(即首先发送FIN),一般是由客户端决定何时终止连接,因为客户进程通常由用户交互控制

UDP:用户数据报协议

UDP是一个无连接、不保证可靠性的传输层协议,也就是说发送端不关心发送的数据是否到达目标主机、数据是否出错等,收到数据的主机也不会告诉 发送方是否收到了数据,它的可靠性由上层协议来保障

首部结构简单,在数据传输时能实现最小的开销,如果进程想发送很短的报文而对可靠性要求不高可以使用

UDP首部

浅谈TCP/IP_第9张图片
端口号表示发送进程和接收进程

UDP长度:指的是UDP首部和UDP数据的字节长度,该字段最小值为8字节,包含数据的长度,可以算出数据的结束位置

UDP校验和:覆盖UDP首部和UDP数据,UDP的差错控制(可选)

  • 如果检验和的计算结果为0,则存入的值全为1(65535),这在二进制反码计算中是等效的。如果传送的检验和为0,说明发送端没有计算检验和
  • 如果发送端没有计算检验和而接收端检测到检验和有差错,那么UDP数据报就要被悄悄地丢弃,不产生任何差错报文(当IP层检测到IP首部检验和有差错时也这样做)
  • UDP检验和是一个端到端的检验和。它由发送端计算,然后由接收端验证。其目的是为了发现UDP首部和数据在发送端到接收端之间发生任何改动

你可能感兴趣的:(node.js,tcp-ip)