tcp/IP和vpn解析

1、计算机网络模型

1.1 OSI通信模型

OSI通信模型
   如图所示,数据的传输过程主要依靠下四层的模块进行,依靠网络层对数据在漫长距离的传输中(经过很多个路由器、交换机)的寻址和选路,也在依靠传输层和数据链路层来实现对需要传输的数据准确无误地传输到对端。

1.2、OSI封装

OSI封装
  OSI封装就是每一层都把上层的协议包当成数据部分,加上自己的协议头部,组成自己的协议包。

2、物理层解析

2.1 信号编码

    通过网络。我们可以获取很多信息,网络中的信号一般都是数字信号。数字信号就是以常见的二进制数字表示的信号,类似“0101”这样的比特流。

2.2 码元

   定义在数字通信中常用时间间隔相同的符号来表示一个二进制数字,这样的时间间隔内的信号称为码元。
注意:一个码元可以携带一个或多个比特信息,但是由于信道内噪声的干扰,一个码元携带的比特信息是有上限的。具体由香农公式求解。

2.3 信号调制与解调

    从信号的“本源”角度来看,信号分为两种:基带信号和带通信号。基带信号就是来自信号源的信号,其中往往包含较多的低频成分,甚至有直流成分。带通信号就是基带信号经过载波调制后的信号,其目的是把信号频率范围搬移到较高的频段,以便在信道中传输。
   调制即载波承载基带信号的方式,包括调幅、调频、调相三种。
   解调即调制的逆向工程。

2.4 物理层描述

  物理层位于OSI七层模型的第一层,有以下两个目的:

  • 为相邻节点设备提供数据传输的通道(信道)
  • 为相邻节点设备提供透明、可靠的比特流传输

3、物理链路层

  物理链路。在网络实体间的链路的基础上,再叠加上一些“规则”(数据链路层协议)就是数据链路。
   数据链路是一些相关协议的集合。数据链路层的三个使命:信息成帧、透明传输、差错检测。

3.1 信息成帧

  把数据信息组合成数据信息块(在数据链路层中将这种数据信息块称为帧,帧是数据链路层的传送单位)。
  帧开始定界:基于一个标记(简称标记法),异步传输通过一个标记比特(起始位),面向字符的同步传输通过一个标记字符,面向比特的同步传输通过一个标记比特串。
  帧结束定界有三种方法:通过字符/比特计数,通过帧结束标记,通过物理层编码违例法。

3.2 透明传输

  在所传输的数据中,如果出现了协议的控制字符,会使数据“混乱”,数据链路层使用两种方法解决:字符填充(即插入转义字符)和比特填充(特殊的比特串后补“0”)。

3.3 差错检测

  比特在传递环节中有可能会发生差错,1变为0,0变为------叫作差错控制。在数据链路测通常使用的差错控制是:CRC校验
   ‌CRC校验是一种用于检测数据传输中出现错误的校验方法。它通过在数据后面附加一个校验码,接收方使用相同的算法对数据进行校验,如果校验码无误,则可以判定数据传输正确。CRC校验主要用于检测数据传输或保存后可能出现的错误,具有原理清晰、实现简单等优点。‌

   ‌CRC校验的原理基于‌模2除法和‌余数的原理。发送方首先定义一个生成多项式,将数据末尾补上与生成多项式位数相等的0,然后用生成多项式进行模2除法,得到的余数即为CRC校验码。接收方收到数据后,用相同的生成多项式进行模2除法,如果没有余数,则数据正确;如果有余数,则数据错误。‌

3.4 点对点协议

  点对点协议(Point-to-Point Protocol,PPP)是一种用于在计算机网络中建立点对点连接的协议。它是一种数据链路层协议,用于在两个网络节点之间传输数据。

PPP提供了一种可靠、可扩展、灵活的点对点连接方式,可以在不同的物理介质上工作,例如串口、ISDN、DSL、以太网等。它可以用于建立远程访问连接、虚拟专用网(VPN)连接等。

  PPP协议包括以下几个主要组成部分:

链路控制协议(Link Control Protocol,LCP):负责在两个节点之间建立、配置和维护连接。它协商连接参数,进行错误检测和修复,以及监控连接状态。

认证协议(Authentication Protocol):用于进行用户认证,以确保连接的安全性。常见的认证协议包括密码认证协议(PAP)和挑战应答认证协议(CHAP)。

网络控制协议(Network Control Protocol,NCP):负责在连接建立后进行网络层协议的配置。例如,IPCP用于配置IP协议参数,IPXCP用于配置IPX协议参数。

  PPP的优点包括:

可靠性:PPP提供了错误检测和修复机制,可以确保数据传输的可靠性和完整性。

可扩展性:PPP支持多种链路层协议和网络层协议,可以适应不同环境和需求的网络。

灵活性:PPP允许动态配置连接参数,支持多种认证方式,可以适应不同的用户和网络接入需求。

3.5 STP协议

  STP(Spanning Tree Protocol,生成树协议)是一种网络协议,用于在有环的网路拓扑中防止数据包的无限循环。

STP的基本原理是通过选择一条最优路径来构建一个无环的逻辑拓扑结构,从而避免数据包在网络中无限循环。STP使用一个根桥(Root Bridge)作为起点,然后通过计算每个桥与根桥的距离,选择一条最短路径作为最优路径。

4、 网络层解析

4.1 环回IP

  给环回接口配置的IP为环回IP(环回接口是虚拟接口,即系统不依赖于任何物理的接口,而是自己虚拟出的一个或多个接口)。
   习惯上把127.0.0.1作为环回地址,实际上127 ...* (排除127.0.0.0和127.255.255.255)都是环回地址。127...* 是环回地址,但环回地址不一定都是127...* 。
  环回接口状态与物理接口无关,只有系统不down,那么环回接口状态为up。系统只要有一个物理接口是UP,环回接口就能通信,所以环回接口具有很强的稳定性。

4.2 单播、组播、广播

  单播是指将信息从一个发送者发送到一个接收者的传输方式。在计算机网络中,单播是一种点对点的通信方式,即将数据从一个源地址发送到一个目的地址。

  广播是一种向网络中所有主机发送数据的通信方式。发送广播消息的主机将数据包发送到网络中的广播地址,然后该网络上的所有主机都会接收到这个广播消息。广播可以用于向网络中的所有主机发送重要通知、更新请求等。广播的主机地址全1,即200.1.1.111

  组播是一种向特定组中的主机发送数据的通信方式。组播需要先建立一个组播组,然后发送数据包到该组的组播地址。只有加入了该组的主机才能接收到组播消息。组播可以用于在特定组内共享数据、同时向多个主机发送数据等。

4.3 NAT协议

  NAT(Network Address Translation)是一种网络协议,用于在互联网和私有网络之间进行IP地址转换。它的主要作用是将私有网络内部的IP地址转换成公共网络可以识别的IP地址,从而实现私有网络与公共网络的互联。

4.4 ARP协议

  ARP(Address Resolution Protocol,地址解析协议)是一种用于将IP地址解析为物理MAC地址的协议。在计算机网络中,每个设备都有一个唯一的MAC地址和一个IP地址。MAC地址是设备的物理地址,而IP地址是用于标识设备的逻辑地址。

4.5 ICMP协议

  ICMP(Internet Control Message Protocol)是一种互联网协议,用于在IP网络上传递控制消息,常用于网络诊断和错误报告。ICMP消息通常由网络设备(如路由器)或操作系统生成并发送给发送ICMP请求的主机。

  ICMP协议的工作方式是:当一个IP包无法传递到目的地时,路由器、主机或其他网络设备将发送一个ICMP消息给源主机,通知它发生了错误情况。这些错误消息包含有关发生错误的信息,例如目标不可达、超时等。通过收集和分析这些错误消息,管理员可以诊断网络问题并采取相应的措施。

  除了错误报告,ICMP还提供了其他一些功能,例如网络探测和测量。例如,通过发送一个特殊的ICMP请求(如Ping),可以测量目的主机的响应时间和可达性。

5、传输层

5.1 tcp报文格式

  TCP报文由TCP首部(报头)和应用数据构成,其中TCP首部是TCP 协议的核心所在,应用数据部分是TCP报文的负载,如下图所示。
tcp报文
以下详细介绍各字段含义:

  • 源端口(Source Port)和目的端口(Destination Port):长度各为16位,即2个字节,分别指示发送端的应用程序使用的端口号以及接收端的应用程序期望接收的端口号。它们的长度说明为什么计算机端口的范围是1-65535 (0不使用,2^16=65536,最大位65536不使用)。有了源端口和目标端口,加上IP首部里的源IP和目标IP,就可以唯一确定一个连接。
  • 序列号(Sequence Number):长度为32位,说明序列号的范围是[0, 2^32-1],也就是[0, 4294967295]。当序号增加到4294967295后,下一个序号将回到0重新开始。在建立连接时由计算机生成的随机数作为其初始值(ISN,即Initial Sequence Number,初始序列号),通过 SYN 包传给接收端主机,每发送一次数据,就累加一次该“数据字节数”的大小。序列号用来解决网络包乱序问题,实现可靠的数据传输和流量控制。
  • 确认号(Acknowledgment Number):长度为32位,只有在ACK标志位被设置时才有效。它指示期望接收的下一个字节的序列号(所以该字段一般都是上次接收成功的数据字节序号加1),用于确认已经成功接收的数据。在TCP连接建立后,确认号的范围通常是相对于初始序号(ISN)的相对偏移量。如果ISN的初始值为X,那么确认号的范围就是[X+1, X+1+N-1],其中N表示已经成功接收的字节数。发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。确认号的范围是[0, 2^32-1],也就是[0, 4294967295]。
  • 数据偏移(Data Offset):长度为4位,指示TCP报文的“数据”起始处距离TCP报文起始处的距离有多远,以4字节为单位计算出的数据段开始地址的偏移值。没有选项时该值为5,即20字节;4位能表示的最大整数是15,也就说明TCP报文里数据开始的位置距离报文起点是60个字节(4*15)。这意味着TCP的首部长度是20-60个字节。
  • 保留(Reserved):长度为3位,保留供将来使用,目前应设置为零。
  • 控制标志(Flags):长度为9位,用于控制和管理TCP连接。各控制标志位说明如下:
    • NS(Nonce Sum):用于支持一种称为ECN-nonce的TCP扩展机制,该机制用于增加拥塞控制的安全性,防止拥塞控制信息被恶意篡改。
    • CWR(Congestion Window Reduced):用于指示发送方减小拥塞窗口(Congestion Window)的大小。CWR标志位通常与拥塞控制机制一起使用,以应对网络拥塞的情况。
    • ECE(ECN-Echo):ECE标志被设置表示发送方支持显式拥塞通知(Explicit Congestion Notification, ECN)机制,并请求接收方通知其关于网络拥塞的情况。接收方在收到设置了ECE标志的TCP报文段后,如果网络出现拥塞,则可以在回复的TCP报文段中设置ECN-Echo标志作为响应。通过使用ECE标志和ECN-Echo回复,TCP连接的发送方和接收方可以共同协调拥塞控制,以提高网络的性能和稳定性。
    • URG(Urgent):指示报文段中包含紧急数据。当URG=1时,表明开启了urgent mode,通知接收方在处理数据时要特别注意紧急数据的处理。URG标志位的设置与紧急指针字段(Urgent Pointer)一起使用。
    • ACK(Acknowledgment):指示确认号字段有效。仅当ACK=1时确认号字段才有效,当ACK=0时确认号无效。TCP规定,在连接建立后所有的传送的报文段都必须把ACK置为1。
    • PSH(Push):指示接收方应立即将数据推送给应用程序,而不是等待缓冲区填满。当两个应用进程进行交互式的通信时,有时一端的应用进程希望在键入一个命令后立即就能收到对方的响应。在这种情况下,TCP就可以使用推送(push)操作。这时,发送方TCP把PSH置为1,并立即创建一个报文段发送出去。接收方TCP收到PSH=1的报文段,就尽快地(即“推送”向前)交付接收应用进程。而不用再等到整个缓存都填满了后再向上交付。
    • RST(Reset):用于复位连接,中断当前的通信。当 RST=1 时,表示 TCP 连接中出现异常(如主机崩溃或其他原因)必须强制断开连接,然后再重新建立连接进行传输。RST置为1还用来拒绝一个非法的报文段或拒绝打开一个连接。
    • SYN(Synchronize):用于建立连接,发起连接请求。在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN=1和ACK=1,因此SYN置为1就表示这是一个连接请求或连接接受报文。
    • FIN(Finish):用于关闭连接,请求终止连接。当FIN=1时,表示发送方没有数据要传输了,要求释放连接。
  • 窗口大小(Window Size):长度为16位,指示接收方的接收窗口大小,用于流量控制,最大的窗口大小为2^16-1=65535=64k。这是早期的设计,对于现在的网络应用,可能会不太够,因此可以在选项里加一个 窗口扩大选项,来传输更多的数据。窗口指的是发送本报文段一方的接受窗口(而不是自己的发送窗口)。窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(以字节为单位)。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。总之,窗口值作为接收方让发送方设置其发送窗口的依据。
  • 校验和(Checksum):长度为16位,用于检测TCP报文段是否在传输过程中发生了错误。校验和计算包括报头和数据。
    紧急指针(Urgent Pointer):长度为16位,只有在URG标志位被设置时才有效。它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据)。因此,在紧急指针指出了紧急数据的末尾在报文段中的位置。当所有紧急数据都处理完时,TCP就告诉应用程序恢复到正常操作。值得注意的是,即使窗口为0时也可以发送紧急数据。
  • 选项(Options):可选字段,长度可变,最长可达40个字节。当没有使用“选项”时,TCP的首部长度是20字节。选项字段用于提供额外的功能和控制,每个选项的开始是 1 字节的kind字段,说明选项的类型。一些常见的选项举例如下:
    • 最大报文段长度(Maximum Segment Size, MSS):占用4字节,通常在创建连接而设置SYN标志的数据包中指明这个选项,指明本端所能 * 接收的最大长度的报文段。通常将MSS设置为(MTU-40)字节,携带TCP报文段的IP数据报的长度就不会超过MTU(MTU最大长度为1518字节,最短为64字节),从而避免本机发生IP分片。只能出现在同步报文段中,否则将被忽略。
    • 窗口扩大因子(Window Scale Factor):占用3字节,取值0-14。用来把TCP的窗口的值左移的位数,使窗口值乘倍。只能出现在同步报文段中,否则将被忽略。这是因为现在的TCP接收数据缓冲区(接收窗口)的长度通常大于65535字节。
    • 时间戳选项(TCP Timestamps Option, TSopt):占用10字节,其中最主要的字段是时间戳字段(Timestamp Value field, TSval, 4字节)和时间戳回送回答字段(Timestamp Echo Reply field, TSecr, 4字节)。时间戳选项允许通信的两端在TCP报文段中包含时间戳值,以便进行一些时间相关的操作和计算。
    • 安全摘要选项(TCP Authentication Option, TCP Option):用于提供数据完整性和身份验证的功能。该选项用于对TCP报文段进行保护,防止数据篡改和未经授权的访问。

5.2 TCP三次握手

三次握手
第一次握手
首先客户端发起连接请求,向服务器发送一个SYN(同步)报文段,段中包含了目的端口和本机端口,设置SYN 标志位为1,即SYN=1,并设置序号字段(Sequence Number)为一个随机选择的x,即seq=x,也就是初始序号(Initial Sequence Number, ISN),如果是第一个连接,很可能是0。此时服务器对应的端口要处于监听状态,客户端发起请求后进入 SYN_SENT 状态,等待服务器的确认。

第二次握手
服务端收到客户端发来的 SYN 报文段,对这个SYN报文段进行确认。服务器向客户端发送一个SYN-ACK报文段作为回应,报文段中的标志位设置为SYN=1和ACK=1,表示同时作为确认和同步;序号字段设置为服务器的随机选择的初始序号y(服务端的TCP段序号),即seq=y;确认号字段(Acknowledgment Number)设置为客户端的初始序号加1,即ack=x+1。服务器端将上述所有信息放到一个TCP段(即SYN+ACK段)中,一并发送给客户端,此时服务器进入SYN_RECV状态。

第三次握手
客户端接收到服务端发来的 SYN+ACK 报文段后,要向服务端发送一个ACK(确认)报文段,对连接请求的确认进行确认。报文段中的标志位设置为ACK=1,确认号字段设置为服务器的初始序号加1,即ack=y+1,序号字段设置为客户端的初始序号加1,即seq=x+1。此时客户端进入 ESTABLISHED(已连接)状态,服务端接收到此 TCP段,也将进入 ESTABLISHED 状态,也就标志着三次握手结束,连接成功建立。

三次握手完成之后,TCP连接就正式建立起来了,双方可以开始进行数据的可靠传输。三次握手的目的是确保双方的初始序号和确认号的同步,并验证双方的可达性。通过这个过程,TCP可以建立一个可靠的双向通信通道,在后续的数据传输中保证数据的可靠性和顺序性。

5.3 tcp四次挥手

四次挥手
第一次挥手
客户端数据发送完成,则向服务端发送连接释放请求的FIN报文(请求连接终止:FIN=1),主动关闭TCP连接。报文中会指定一个序列号seq=u,并停止再发送数据,但依然能够接收数据。此时客户端处于 FIN_WAIT_1 状态,等待服务端确认。TCP规定,FIN报文即使不携带数据,也要消耗一个序号。

第二次挥手
服务端收到FIN报文之后,通知相应的高层应用进程,告诉它客户端向服务端这个方向的连接已经释放了。此时服务端向客户端发出连接释放的应答ACK报文,并进入了CLOSE_WAIT(关闭等待)状态。ACK报文头包含:ACK=1,ack=u+1,并且带上自己的序列号seq=v。这里ack=u+1是第一次挥手的序列值+1,表示希望收到从第u+1个字节开始的报文段,并且已经成功接收了前u个字节。

客户端收到服务端的确认后,进入 FIN_WAIT_2 状态,等待服务端发出的连接释放报文段。

前两次挥手既让服务端知道了客户端想释放连接,也让客户端知道了服务端已了解自己想要释放连接的请求。

第三次挥手
如果服务端也想断开连接,就向客户端发送连接释放报文。由于在CLOS_WAIT状态,服务端很可能又发送了一些数据,假定此时连接释放报文的序列号为seq=w,ack也是取第一次挥手的seq +1,即ack=u+1,这和第二次挥手时是一样的。

此时服务端就进入了LAST_ACK(最后确认)状态,等待客户端的确认,并停止向客户端发送数据,但服务端仍能够接收从客户端传输过来的数据。

第四次挥手
客户端收到服务器的连接释放报文后,一样发送一个 ACK 报文作为应答(ack=w+1,seq=u+1), 此时客户端处于TIME_WAIT(时间等待)状态,并在这个状态等待 2MSL(Two Maximum Segment Lifetime, 最大报文生存时间)。

服务端收到从客户端发出的 TCP 报文之后结束 LAST-ACK 阶段,进入 CLOSED 阶段。客户端等待完 2MSL之后,结束 TIME-WAIT 阶段,进入 CLOSED 阶段,由此完成四次挥手。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值