当前位置: 首页 > 后端技术 > Node.js

浅谈TCP-IP

时间:2023-04-03 19:06:01 Node.js

TCP/IP四层协议体系1)链路层,有时也称为数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中相应的网络接口卡片。它们一起处理与电缆(或任何其他传输介质)的物理接口的细节。2)网络层,有时称为网际层,处理网络中数据包的活动,如数据包路由。在TCP/IP协议族中,网络层协议包括IP协议(InternetProtocol)、ICMP协议(InternetControlMessageProtocol)和IGMP协议(InternetGroupManagementProtocol)。3)传输层主要为两台主机上的应用程序提供端到端的通信。在TCP/IP协议族中,有两种不同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。TCP在两台主机之间提供高度可靠的数据通信。它所做的工作包括将应用程序给它的数据分成合适的小块并发送给较低的网络层,确认收到的数据包,设置发送最终确认数据包的超时时钟等。由于传输层提供高可靠性的端到端通信,应用层可以忽略所有这些细节。UDP为应用层提供了非常简单的服务。它只是将称为数据报的数据包从一台主机发送到另一台主机,而不保证数据报一定会到达另一端。任何所需的可靠性必须由应用层提供4)应用层负责处理特定的应用细节。几乎所有不同的TCP/IP实现都提供以下常见应用:Telnet远程登录。FTP文件传输协议。SMTP简单邮件传输协议。SNMP简单网络管理协议链路层Internet协议族中的最低层协议。链路层协议属于TCP/IP协议族。链路层有三个主要目的:为IP模块发送和接收IP数据报,为ARP模块发送它们ARP请求和接收ARP回复发送RARP请求和接收RARP的RARP回复在网络中使用的硬件上,例如以太网、令牌环、FDDI类型数据接口)和以太网链路层协议,例如RS-232串行线路、两个串行接口链路层协议(SLIP和PPP),以及环回(lopback)驱动程序包含在大多数实现中SLIP:串行线路IP它是一种在串行线路上封装IP数据报的简单形式。以下规则描述了SLIP协议定义的帧格式:IP数据报以特殊字符END(0xc0)结束,为了防止数据报到达之前的线路噪声被视为数据报的内容,大多数实现还在数据报的开头传输一个END字符(如果有线路噪声,END字符会阻塞错误消息,所以当前消息可以正确传输,并且在上一个错误消息交给上层后,它会发现它的内容没有意义而被丢弃)如果IP消息中的一个字符是END,那么必须连续发送两个字符section0xdb和oxdc来替换它。特殊字符oxdb称为SLIP的ESC字符。如果IP包中的一个字符是SLIP的ESC字符,那么必须连续发送两个字节0xdb和oxdd来代替它。SLIP是一种简单的帧封装方法,它有一些缺陷:每一端都必须知道对象的IP地址,没有办法通知另一端该端的IP地址,数据帧中没有类型字段,如果使用串行线对于SLIP,那么它不能同时使用其他协议SLIP数据帧中没有添加校验和。如果SLIP传输的报文受到线路噪声的影响而发生错误,只能通过上层协议发现(另一种方法是新调制解调器可以检测并纠正错误报文)。这些缺点,SLIP仍然是一个广泛使用的协议PPP:Point-to-pointprotocolPPP点对点协议修改了SLIP协议中的所有缺陷,PPP包括以下三个部分:1)封装IP数据报的方法串行链接。PPP不仅支持8位数据无奇偶校验的异步模式(如大多数计算机上普遍存在的串行接口),还支持面向比特的同步链路2)用于建立、配置和测试数据链路的链路控制协议(LCP:链路控制协议)。它允许通信双方协商确定不同的选项3)网络控制协议(NCP:NetworkControlProtocol)系统用于不同的网络层协议。当前RFC定义的网络层包括IP、OSI网络层、DECnet和AppleTalk。与SLIP相比,PPP有以下优点:PPP支持在单条串口线上运行多种协议,而且不仅IP协议对每一帧都有循环冗余校验。通信双方可以进行IP地质动态协商(使用IP网络控制协议)与CSLIP类似,压缩TCP和IP包头链路控制协议可以设置多个数据链路选项这些优势付出的代价是在包头中增加3个字符每一帧,在链路建立时发送几帧协商数据,实现更复杂的环回接口。大多数产品都支持环回接口(LoopbackInterface),以允许运行在同一主机上的客户端程序和服务器程序通过TCP/IP进行通信。A类网络号127是为环回接口保留的。按照惯例,大多数系统都会给这个接口分配IP地址127.0.0.1,并命名为localhost。发送到loopback接口的IP数据报不能出现在任何网络上:一旦传输层检测到目的地址是loopback地址,应该可以省略一些传输层和所有网络层逻辑操作。但是,大多数产品还是完成了传输层和网络层的所有过程,但是当IP数据报离开网络层时,它返回给自己是:1)任何发送到环回地址(通常是127.0.0.1)的数据是输入为IP2)发送到广播地址或多播地址的数据报的副本被发送到环回接口,然后发送到以太网3)任何传输到主机IP地址的数据都被发送到环回接口MTU以太网和802.3对数据帧的长度有限制,最大值分别为1500和1492字节。链路层的这个特性叫做MTU,最大传输单元,大多数不同类型的网络都有一个上限。如果IP层有一个数据报要传输,并且数据的长度大于链路层的MTU,那么IP层就需要Fragmentation,将数据报分成若干片,让每一片都小于MTU点对点链路层(如SLIP和PPP)。MTU不是指网络介质的物理特性。相反,它是一种逻辑限制,目的是为交互式使用提供足够快的响应时间TCP/IP协议族中最核心的协议,所有的TCP/UDP/ICMP和IGMP数据都以IP数据报格式传输。IP提供不可靠和无连接的数据报传输服务:不可靠(unreliable)是指不能保证一个IP数据报一定能成功到达目的地。IP提供最好的传输服务。如果发生某种错误,例如路由器暂时用完缓冲区,IP有一个简单的错误报告算法:丢弃数据报,然后向源端的任何请求方发送ICMP消息。可靠性必须由上层(如TCP)提供无连接意味着IP不维护有关后续数据报的任何状态信息。每个数据报的处理是相互独立的。IP数据报可能会乱序接收。如果源向同一目的地发送两个连续的数据报(先是A,然后是B),则每个数据报都是独立的。对于路由选择,可能会选择不同的路由,所以B可能比A先到达IP头。普通IP报头长度为20字节,除非包含选项字段IP数据报格式和报头中的字段,如图显示:最高位在左边,记录为0bit,最低位在右边,记录为31bitVersion:当前协议版本号为4,因为IP有时也称为IPV4header:header占用32bit字数,包括任何options。由于它是一个4位字段,因此标头的最大长度为60个字节。服务类型:包括一个3位优先级子域(现在忽略),4位TOS子域和1位未使用位必须设置为0,4位TOS分别代表:最小延迟、最大吞吐量、最大可靠性和最小成本.只能设置4位中的1位。TotalLength:该字段用于表示整个IP数据包的长度,最多65535字节,包括Header和dataidentifier:唯一标识主机发送的每个数据报Flag:分为3个字段,后面是保留位,非-fragmentedbitsandmorefragmentedbitsReservedbits:一般设置为0withoutfragmentedbits:表示数据报是否分片。如果设置为1,则数据报不能分片。如果要分片,则应设置为0。更多分片:除最后一个分片Fragment外,组成数据报的每个其他分片都必须将此位置设置为1。段偏移:分片相对于分片的偏移量原始数据报的开始TTL(TimetoLive):该字段用于指示一个IP数据包的生命周期,可以防止一个数据包在网络中无限发送。TTL表示数据包在被丢弃之前在网络中的最大周转时间。数据包经过的每台路由器都会检查该字段的值,当TTL值为0时,数据包将被丢弃。TTL对应的是数据包通过路由器的次数。数据包每经过一个路由器,TTL都会负1。目的主机和网络中的每个网关都必须重新计算报头的校验和。如果传输过程中头部没有错误,接收方计算的结果应该全为1。如果结果不全为1(即校验错误),那么IP会长时间丢弃收到的数据报,但不会产生错误信息,上层找到数据重传。SourceIPaddress:该字段用于表示数据包的源地址,指的是设备的网络地址DestinationIPaddress:该字段用于表示数据包的目的地址,指的是设备的网络地址到接收节点的网络地址Optional:是数据报中的变长可选信息,option字段总是使用32bit作为连线,必要时插入0值填充字节,以保证IP标头始终是32位的整数倍。IP路由是大多数主机使用的IP路由机制:点对点链路)或两者在共享网络(以太网或令牌环网络)上,则IP数据报直接发送到目的主机,否则主机发送数据报到默认路由器,由路由器转发数据报路由表中的每一项包含以下信息:目的IP地址:可以是完整的主机地址或网络地址,标志由中的标志字段指定theentry:其中一个标志表示目的IP地址是网络地址还是主机地址,另一个标志表示下一跳路由器是真正的下一跳路由器还是直连接口指定数据报的网络接口传输IP路由是逐跳的IP不知道到任何目的地的完整路径(除了那些直接连接到鱼主机的),所有IP路由只提供下一跳路由器的IP地址进行数据报传输。它假定下一跳路由器比发送数据报的主机更靠近目的地,并且下一站路由器直接连接到主机。IP路由选择主要完成以下功能:1)搜索路由表,找到一个能与目的IP地址完全匹配的条目(网络号和主机号都必须匹配),如果找到,则将报文发送给下一个——条目指定的跳路由器或直接连接的网络接口(取决于标志字段的值)2)搜索路由表以找到与目的网络号匹配的条目。如果找到,则将数据包发送到条目指定的下一跳路由器或直接连接的网络接口(取决于标志字段的值)。目标网络上的所有主机都可以由该条目处理3)在路由表中搜索标记为“default”的条目。如果找到,则将数据包发送到条目指定的下一跳路由器。如果以上步骤均未成功,则无法传递数据报。如果无法投递的数据报来自本地机器,一般会向生成数据报的应用程序返回“主机不可达”或“网络不可达”的错误。为网络指定一个路由器,而不是为每个主机指定一个路由器,这是IP路由机制的另一个基本特征。这样做可以大大减少路由表的大小。例如,Internet上的路由器只有几千个条目,而不是超过一百万个条目。IP地址分类中的网络部分由互联网地址分配机构统一分配,这样可以保证IP的唯一性。ip地址中的ip全为1,即255.255.255.255。它被称为受限广播地址。如果作为数据包的目的地址,可以理解为发送给所有网络上的所有主机ip地址中全0的ip为0.0.0.0,表示启动时的ip地址,表示未分配时的ip地址127用于本地测试,除了127.255.255.255,其他127开头的地址代表本机如图,红色为网络部分,绿色为主机部分的子网地址。现在要求所有主机都支持子网寻址。如果把IP看成一个简单的网络号和一个主机号组成,A类和B类地址给主机号分配的空间太多了,可以容纳的主??机号有2^24-2和2^16-2(全0和全1除外),但是人在一个网络中并没有安排那么多主机。现在将主机号分为子网号和主机号。例如B类地址,前16位为网络号,主机号后16位分为8位子网号,8为主机号。子网向外部路由器隐藏了内部网络组织(校园或公司)的详细信息。这样,外部路由器只需要知道下一跳路由的子网号,而不需要知道具体的主机号,可以大大减小路由表的大小。子网掩码子网掩码也叫子网掩码,它是一个掩码,用来表示IP地址的哪些位标识主机所在的子网,哪些位标识主机位。子网掩码不能单独存在,必须与IP地址配合使用。子网掩码只有一个作用,就是把一个IP地址分成两部分:网络地址和主机地址。地址和子网掩码的逻辑与运算结果是网络地址0和任何数字为01以及任何数字等于任何数字本身。两个不同的B类地址子网掩码示例如图:ABC3A类地址有自己默认的子网掩码:ClassA255.0.0.0ClassB255.255.0.0ClassC255.255.255.0IP地址和子网掩码后给定后,主机可以确定IP数据报的目的:本网络中其他子网中的主机其他网络中的主机TCP:传输控制协议TCP提供面向连接的、可靠的字节流服务TCP提供全双工服务,即、数据可以同时双向传输Connection是指两个使用TCP的应用程序(通常是client和server)在相互交换数据之前必须先建立TCP连接,以保证接收和发送都正常。TCP通过以下方式提供可靠性:应用数据被分成TCP认为最适合发送的数据块,TCP传递给IP的信息单元成为消息段或段(Segment)。当TCP发送一个报文段时,它会启动一个计时器并等待目的地确认收到该报文段,如果不能及时收到确认,将重新发送该报文段一秒钟,TCP将保留其报头和数据的校验和。这是一个端到端的校验和,用于检测传输中数据的任何变化。如果收到的报文段的校验和有错误,TCP会丢弃报文段而不确认报文段的接收(希望发送方超时重发)。由于TCP段是作为IP数据报传输的,而IP数据报的到达可能是乱序的,所以TCP段的到达也可能是乱序的。如果需要,TCP会对接收到的数据进行重新排序,并将接收到的数据按照正确的顺序交给应用层。由于IP数据报会发生Duplication,TCP的接收端必须丢弃重复的数据TCP也可以提供流量控制。TCP连接的每一端都有固定大小的缓冲区空间,TCP的接收端只允许对方发送接收端缓冲区可以接受的数据,这会导致速度较快的主机溢出本端的缓冲区较慢的主机。源端口号和目的端口号,计算机通过端口号识别访问哪个服务,如http服务或ftp服务,发送端端口号为随机端口,目的端口号决定接收端接收源端哪个程序端口号:发送TCP进程对应的端口号目标端口号:目标端接收进程的端口号32位序列号:0~2^32-1范围内的32位序列号numberTCP使用序号来标记数据包,使之能够到达目的地重载后,假设当前序号为s,发送数据长度为l,则下次发送数据时的序号为s+湖。在建立连接时,通常由计算机产生一个随机数作为序列号的初始值。32位确认号:在0~2^32-1范围内,发送端的确认信息,告诉发送端该序号之前的数据段已经收到。.Acknowledgement确认号,等于下次应该接收的数据的序号。假设发送方的序号是s,发送数据的长度是l,那么接收方返回的确认号也是s+l。发送方收到确认响应后,可以认为该位置之前的所有数据都已正常接收。Headerlength:TCP头的长度,单位为4字节。如果没有可选字段,这里的值为5。表示TCP头的长度为20字节。控制位:TCP的连接、传输和断开都在这六个控制位的指挥下进行。如果连接断开,请重新连接URG(紧急紧急位)紧急信号。仅当URG(urgentemergency)控制位为1时有效。指示紧急数据的结束在TCP数据段中的何处。通常当通信暂时中断时(例如输入Ctrl+C)ACK(acknowledgmentconfirmation)为1表示确认号。确认序号有效位,表示数据包中包含确认信息SYN(在线同步建立)同步序号位TCP在建立连接时应将此值置1。为1时,请求建立连接。连接方将FIN设置为1,表示要断开连接。为1时,数据提交完成,断开连接请求窗口值:表示本地可以接收到的数据段数,这个值的大小是可变的。当网络顺畅时,增大窗口值以加快传输速度,当网络不稳定时减小该值以保证网络数据的可靠传输。它是TCP传输中流量控制的窗口大小:用来表示从响应号中可以接受多少个8位字节。如果窗口大小为0,则可以发送窗口检测16位校验和:主要用于实现差错控制,TCP校验和的计算包括TCP头、数据和其他填充字节。发送TCP数据段时,校验和由发送端计算,到达目的地时进行校验和计算。如果两次校验和一致,则说明数据正确,否则认为数据损坏,接收端将丢弃该数据。TCP三次握手为了建立TCP连接,过程如下:第一次握手主机A通过一个标志为SYN标志的数据段发送给主机B请求连接。通过这个数据段,主机B被告知他要建立连接,B需要响应,并告诉主机B发送的初始序列号。第二次握手是主机B回应确认ACK第一次是发送ACK告诉主机A数据段已经收到,第二次是通知主机A从哪个序列号开始标记。第三次握手是当主机A确认收到主机B的数据段并可以开始传输实际数据时。这三个报文段完成了连接的建立。这个过程也称为三次握手。TCP的四次挥手需要三次握手才能建立连接,四次握手才能终止连接。这是TCP半关闭引起的TCP。连接是全双工的(即数据可以同时在两个方向上传递),所以每个方向都必须单独关闭。其原理是当一方完成自己的数据传输任务后,可以发送一个FIN来终止这个方向的链路。当一端收到一个FIN时,它必须通知应用层另一端已经终止了该方向的数据传输。发送FIN通常是收到FIN,因为应用层关闭仅意味着该方向没有数据流。一个收到FIN后仍能发送数据的TCP连接,先关闭的一方(即发送第一个FIN)会进行主动关闭,而另一方(收到这个FIN)会进行被动关闭。通常一方完成主动关闭,另一方完成被动关闭。客户端发送一个FIN控制位来发出断开连接的请求,用于关闭客户端到服务器的数据传输。当服务器收到这个FIN时,它发回一个ACK??来确认序列号。将收到的序列号加1。和SYN一样,一个FIN会占用一个序号,TCP服务器也会向应用程序发送一个文件结束字符(即丢弃服务器),然后服务器程序会关闭它的连接。客户端确认收到服务器的关闭连接请求并发回一个Confirm,并将确认序列号设置为接收到的序列号加1,以终止一个连接的典型握手序列。在图中,发送FIN将导致应用程序关闭它们的连接。这些FIN和ACK是TCP软件自动生成的。通常由客户端发起,让第一个SYN从客户端传输到服务器,每一端都可以主动关闭连接(即先发送FIN)。通常,客户端决定何时终止连接,因为客户端进程通常由用户交互控制运行UDP:UserDatagramProtocolUDP是一种不保证可靠性的无连接传输层协议。它不会告诉发送方数据是否已经收到,其可靠性由上层协议保证。头部结构简单,数据传输时开销最小。如果进程要发送很短的消息,对可靠性要求不高,可以使用UDP头端口号来表示发送进程和接收进程的UDP长度:指的是UDP头和UDP的字节长度数据。该字段最小值为8字节,包括数据的长度,可以计算出数据的结束位置。UDP校验和:覆盖UDP头和UDP数据,UDP差错控制(可选)如果校验和计算结果为0,则存储的值全为1(65535),相当于二进制补码计算。如果传输的校验和为0,则表示发送方没有计算校验和。如果发送方没有计算校验和而接收方检测到校验和有错误,那么UDP数据报将被悄悄丢弃,没有任何错误消息(当IP层检测到IP头校验和有错误时也会这样做)UDP校验和是端到端的校验和。它由发送方计算,然后由接收方验证。其目的是发现发送方和接收方之间UDP报头和数据的任何变化