一. 计算机网络
计算机网络,简称网络,是一种将分散的、具有独立功能的计算机系统,通过通信设备和线路连接起来,以功能完善的网络软件(即网络通信协议、信息交换方式及网络操作系统等)实现网络中资源共享和信息传递的系统。
以下是计算机网络的主要特点和功能:
- 资源共享:网络上的计算机用户可以访问其他计算机上的资源,如软件、硬件和数据。这种资源共享可以大大提高资源的使用效率。
- 数据传输:计算机网络允许用户在不同地理位置之间进行数据交换和传输,包括电子邮件、文件传输、远程登录等。
- 分布式处理:多台计算机可以协同完成一项任务,从而提高整体的处理能力和效率。
- 负载均衡:在计算机网络中,任务可以被分配到多个计算机上进行处理,从而减轻单一计算机的负担,提高整个系统的性能。
根据网络覆盖的地理范围,计算机网络可以分为局域网(LAN)、城域网(MAN)、广域网(WAN)和互联网(Internet)。其中,局域网通常用于连接一个单位内部的计算机,而互联网则是全球范围内最大的计算机网络,由各种不同类型的网络相互连接而成。
计算机网络的发展经历了从简单到复杂、从低级到高级的过程。早期的计算机网络主要用于军事和科研目的,而现在的计算机网络已经广泛应用于各个领域。随着技术的不断进步,计算机网络也在不断发展和完善,新的网络协议、新的网络技术和新的网络应用不断涌现。
二. 计算机网络体系结构
我们知道计算机网络是将分散的,独立的计算设备(如电脑、手机等)连接起来,让其可以资源共享和信息传递。那么这些不同类型的,不同厂商的设备,是如何进行通讯的呢?如果每个厂商每个体系结构的设备都自己的一套通讯规则,那显然是不行的,所以计算机网络协议就应运而生了。它定制了统一的标准,让不同的设备可以进行通讯。
学习计算机网络领域知识的过程,就是理解网络协议的构成、原理和工作方式的过程。
OSI七层模型和TCP/IP模型
OSI七层模型
开放系统互连参考模型 (Open System Interconnect 简称OSI)是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参考模型,为开放式互连信息系统提供了一种功能结构的框架。其目的是为异种计算机互连提供一个共同的基础和标准框架,并为保持相关标准的一致性和兼容性提供共同的参考。这里所说的开放系统,实质上指的是遵循OSI参考模型和相关协议能够实现互连的具有各种应用目的的计算机系统。
OSI采用了分层的结构化技术,共分七层,物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
TCP/IP模型
OSI模型比较复杂且学术化,所以我们实际使用的TCP/IP模型,分5层,物理层 、数据链路层(也有TCP/IP模型将物理层、数据链路层合称为网络接口层,与之对应的,协议就被称为TCP/IP四层协议模型)、网络层、传输层、应用层。两个模型之间的对应关系如图所示:
无论什么模型,每一个抽象层建立在低一层提供的服务上,并且为高一层提供服务。因为我们实际使用的TCP/IP模型,所以下面都是基于这个展开。
TCP/IP协议族
TCP/IP协议族(Transmission Control Protocol/Internet Protocol Suite)是一组网络通信协议,用于实现互联网(Internet)上的数据通信。这个协议族定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。TCP/IP协议族并不仅仅包含TCP和IP两个协议,而是由多个具有不同功能和层次的协议所组成,这些协议共同协作,确保数据在复杂的网络环境中可靠地传输。
总的来说,TCP/IP协议族是一个庞大而复杂的系统,它定义了互联网通信的各个方面,从应用程序之间的通信到数据在物理网络上的传输。
IP、TCP和UDP
首先说IP,IP(Internet Protocol)即互联网协议 ,是互联网中用于数据传输的一种网络协议。从上面的图示可以看到,它是属于网络层的。
它定义了数据包(或称为IP数据报)的格式、寻址方式、路由选择、数据报分片与重组等,使得不同的网络设备(如计算机、路由器、交换机等)可以在互联网上相互通信。
IP协议的主要功能包括:
- 寻址:IP地址是互联网中每个设备或服务的唯一标识。它允许数据包在网络中被正确地路由到目的地。
- 封装:IP协议将上层协议(如TCP、UDP等)的数据封装成IP数据报,并添加IP头部信息,如源IP地址、目的IP地址、数据报长度、生存时间(TTL)等。
- 路由:路由器使用IP地址信息来决定数据包的传输路径。这涉及到查找路由表以确定下一跳(next hop)的地址。
- 分片与重组:当数据包的大小超过网络链路的最大传输单元(MTU)时,IP协议会将其拆分成多个较小的分片,并在目的地重新组合。
- 流量控制:IP协议并不直接负责流量控制,但某些IP选项(如Type of Service字段)可以用于支持网络中的服务质量(QoS)和流量整形。
IP协议有两个主要版本:IPv4(Internet Protocol version 4)和IPv6(Internet Protocol version 6)。IPv4使用32位地址,而IPv6使用128位地址,提供了更大的地址空间。IPv6还改进了IPv4中的一些限制,如地址空间耗尽、安全性、网络配置等问题。
再来说一下TCP,TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流 的传输层通信协议。它建立在IP协议(Internet Protocol,互联网协议)之上,为应用程序提供可靠的通信服务。TCP协议通过确认、窗口控制、重传控制、拥塞控制等 机制来确保数据的可靠传输。
TCP协议的主要特点包括:
- 面向连接:TCP在发送数据之前必须先建立连接,即三次握手(Three-way Handshake)。连接建立后,数据可以在两个方向上进行传输,直到连接被关闭。
- 可靠性:TCP通过确认机制(ACK)来确保数据的可靠传输。接收端在收到数据后会发送一个确认报文段,告诉发送端数据已成功接收。如果发送端在一段时间内没有收到确认报文段,则会重传数据。
- 字节流服务:TCP将应用层发送的数据视为字节流,不保证接收端收到的数据块与发送端发送的数据块具有相同的边界。这意味着TCP不关心发送端写入数据的次数和每次写入数据的大小,而是根据TCP缓冲区的实际情况进行数据的拆分和重组。
- 全双工通信:TCP连接是全双工的,即数据可以在两个方向上同时传输。
- 流量控制:TCP通过滑动窗口机制来实现流量控制,防止发送端发送过多的数据导致接收端缓冲区溢出。接收端会告诉发送端其接收窗口的大小,发送端根据接收窗口的大小来决定发送数据的量。
- 拥塞控制:TCP通过慢开始、拥塞避免、快重传和快恢复等算法来防止网络拥塞。当网络出现拥塞时,TCP会降低发送速率,以减轻网络负担。
TCP协议在许多应用中扮演着重要角色,如文件传输(FTP)、电子邮件(SMTP)、远程登录(Telnet)和网页浏览(HTTP)等。这些应用通常需要可靠的数据传输服务,而TCP正是提供了这样的服务。
最后是UDP,UDP (User Datagram Protocol) 是一种无连接 的传输层协议,它主要用于在计算机网络中传输数据包(称为数据报)。与 TCP(传输控制协议)不同,UDP 不提供数据包的顺序、错误检查或重传保证。因此,UDP 通常用于需要高速传输和较低开销的应用,尽管这可能导致数据包丢失或损坏。
以下是 UDP 的一些主要特点:
- 无连接:UDP 在发送数据之前不需要建立连接。这意味着 UDP 可以在发送数据后立即关闭连接,从而减少了开销。
- 无错误检查或重传:UDP 不提供像 TCP 那样的错误检查或重传机制。如果数据包在传输过程中丢失或损坏,UDP 不会尝试修复或重新发送它。这使得 UDP 比 TCP 更适合那些可以容忍数据包丢失的应用。
- 面向数据报:UDP 将应用层数据封装成数据报进行发送,每个数据报都包含完整的源地址和目的地址信息。因此,UDP 可以将多个数据报发送到不同的目的地,而不需要像 TCP 那样在单个连接上发送所有数据。
- 开销小:由于 UDP 不需要建立连接和进行错误检查,因此它的开销比 TCP 小得多。这使得 UDP 在需要高速传输和较低开销的场景中非常有用。
- 实时性:由于 UDP 不需要等待确认或重传数据包,因此它可以更快地传输数据。这使得 UDP 在需要实时通信的应用中非常有用,如在线游戏、音频和视频流等。
需要注意的是,虽然 UDP 提供了较低的开销和较快的传输速度,但它也增加了数据包丢失和损坏的风险。因此,在使用 UDP 时需要仔细考虑应用的需求,以确保数据传输的可靠性和准确性。
TCP/IP网络传输中的数据
数据以TCP/IP协议方式在网络传输的过程中,每一层接到上一层的数据后,会将其整体作为数据,并在其基础上附加上一个自己的首部,再传给下一层。这个首部中会包含本层的一些必要信息。
网络中传输的数据包由两部分组成:一部分是协议所要用到的首部,另一部分是上一层传过来的数据。首部的结构由协议的具体规范详细定义。在数据包的首部,明确标明了协议应该如何读取数据。反过来说,看到首部,也就能够了解该协议必要的信息以及所要处理的数据。
这么说可能并不直观,看下面的图示:
在上面的示例图中,发送端发送数据给接收端,这个过程大体是这样的:
-
发送端应用程序处理 :首先应用程序会进行编码处理产生 报文/消息(message)交给下面的TCP层。
-
发送端的 TCP 模块处理: TCP 根据应用的指示,负责建立连接、发送数据以及断开连接。TCP 提供将应用层发来的数据顺利发送至对端的可靠传输。为了实现这一功能,需要将应用层数据封装为 报文段(segment)并附加一个 TCP 首部然后交给下面的IP层。
-
发送端 IP 模块处理: IP 将 TCP 传过来的 TCP 首部和 TCP 数据合起来当做自己的数据,并在 TCP 首部的前端加上自己的 IP 首部生成**IP数据报(datagram)**然后交给下面的数据链路层。
-
发送端数据链路层处理: 从 IP 传过来的 IP 包对于数据链路层来说就是数据。给这些数据附加上链路层首部封装为 链路层帧(frame),生成的链路层帧(frame)将通过物理层传输给接收端。
-
接收端数据链路层处理: 接收端主机收到链路层帧(frame)后,首先从链路层帧(frame)首部找到 MAC 地址判断是否为发送给自己的包,若不是则丢弃数据。 如果是发送给自己的包,则从以太网包首部中的类型确定数据类型,再传给相应的模块,如 IP、ARP 等。这里的例子则是 IP 。
-
接收端 IP 模块处理: IP 模块接收到数据后也做类似的处理。从包首部中判断此 IP 地址是否与自己的 IP 地址匹配,如果匹配则根据首部的协议类型将数据发送给对应的模块,如 TCP、UDP。这里的例子则是 TCP。
-
接收端 TCP 模块处理: 在 TCP 模块中,首先会计算一下校验和,判断数据是否被破坏。然后检查是否在按照序号接收数据。最后检查端口号,确定具体的应用程序。数据被完整地接收以后,会传给由端口号识别的应用程序。
-
接收端应用程序处理: 接收端应用程序会直接接收发送端发送的数据。通过解析数据,展示相应的内容。
地址和端口
MAC地址
MAC(Media Access Control)地址,也称为物理地址、硬件地址或链路地址,是一个用来定义网络设备位置的独一无二的地址。在局域网(LAN)中,MAC地址被用于识别网络中的各个设备,并允许数据在它们之间传输。
MAC地址的特点:
- 唯一性:MAC地址在全球范围内是唯一的。制造商会根据一定的规则为其生产的每个网络设备分配一个唯一的MAC地址。
- 固定性:MAC地址通常被烧录在设备的网络接口卡(NIC)上,是设备的物理属性之一,因此通常不会改变(除非硬件被更换或修改)。
- 格式 :MAC地址通常由48位二进制数表示,但为了便于阅读和记忆,它们通常被分为六组,每组由两个十六进制数字表示,并用冒号或连字符分隔。例如:
00:1A:2B:3C:4D:5E
。
MAC地址的用途:
- 网络通信:在数据链路层,网络设备使用MAC地址来识别彼此,从而确保数据能够准确地发送到目标设备。
- 网络管理:管理员可以使用MAC地址来追踪和识别网络中的设备,进行故障排除和网络监控。
- 安全控制:某些网络设备(如路由器或交换机)支持基于MAC地址的访问控制列表(ACL),从而可以根据MAC地址来限制或允许网络访问。
如何查看MAC地址
windows系统下可以在控制台使用"ipconfig -all"指令,如下图:
Linux系统下方式更多一下比如"ifconfig -a"、"ip link show"等等,这里就不一一展示了。
思考问题:既然说在数据链路层,网络设备使用MAC地址来识别彼此。那传输数据时,发送端就必须知道接收端的MAC地址。那么问题来了,在通过互联网传输的时候,发送端和接收端分属于不同网络,在发送端发送信息时需不需要知道接收端的MAC地址?若需要,那是怎么获取的接收端MAC地址?
上面的思考问题这里就不展开聊了,感兴趣的朋友可以自己了解一下,提示一下:"ARP协议"。
IP地址
IP地址(Internet Protocol Address)是用于在Internet上唯一标识一个网络设备的数字标签。它允许数据包在网络中路由并传输到其目标设备。
IP地址的类型
- IPv4(Internet Protocol version 4) :
- 是最常用的IP地址版本,由32位二进制数组成,通常表示为四个十进制数,每个数之间用点(.)分隔,如
192.168.1.1
。 - IPv4地址空间有限,目前已经基本分配完毕。
- 是最常用的IP地址版本,由32位二进制数组成,通常表示为四个十进制数,每个数之间用点(.)分隔,如
- IPv6(Internet Protocol version 6) :
- 是IPv4的继任者,旨在解决IPv4地址空间耗尽的问题。
- IPv6地址由128位二进制数组成,通常表示为8组由冒号(:)分隔的十六进制数,如
2001:0db8:85a3:0000:0000:8a2e:0370:7334
。 - IPv6提供了巨大的地址空间,并增加了许多其他特性来改进IP网络的效率和安全性。
IP地址的类别
(注:这主要是针对IPv4地址的分类)
- A类:地址范围从1.0.0.0到126.0.0.0,主要分配给大型网络。
- B类:地址范围从128.0.0.0到191.255.0.0,通常分配给中等规模的网络。
- C类:地址范围从192.0.0.0到223.255.255.0,主要用于小型网络。
- D类:用于组播(Multicast)地址,范围从224.0.0.0到239.255.255.255。
- E类:保留用于实验和研究,范围从240.0.0.0到255.255.255.255。
私有IP地址
有一些IP地址范围被保留为私有地址,这些地址不能在Internet上路由,只能用于内部网络。常见的私有IP地址范围包括:
- 10.0.0.0 - 10.255.255.255(A类)
- 172.16.0.0 - 172.31.255.255(B类)
- 192.168.0.0 - 192.168.255.255(C类)
公共IP地址
公共IP地址(也称为全局IP地址)是在Internet上唯一分配的地址,可以从任何位置访问这些地址。它们用于Internet上的路由器和主机设备。
IP地址和MAC地址的区别
- IP地址是网络层的地址,用于路由数据包。
- MAC地址(Media Access Control)是链路层的地址,用于在同一局域网内唯一标识网络设备。当数据包在局域网内传输时,使用MAC地址;当数据包需要在不同网络之间传输时,使用IP地址和路由器进行转发。
端口号
通过前面我们知道,通过IP地址和MAC地址,我们可以准确的定位到通讯的设备。那么当设备接收到通讯数据后,如何知道交给哪个应用程序处理?
其实在传输层,也有类似于地址的概念,这就是端口号。端口号(Port Number)在计算机网络中用于标识主机上的一个特定应用程序或服务。因此它也被称为"程序地址 "。
端口号的范围是范围从0到65535(共65536个),但在实际应用中,端口号0被保留为无效端口或表示所有端口,因此实际上可用的端口号是从1到65535,共计65535个。
问:为什么端口号为65535个?
答:因为在TCP、UDP协议报文的开头,会分别有16位二进制来存储源端口号和目标端口号,所以端口个数是 2^16=65536个,但是0被保留为无效端口或表示所有端口,所以实际可用的端口号是65535个。
总结一下
我们现在知道了,根据端口号可以定位到某一个特定的应用或服务。结合之前的IP地址和MAC地址,总的来说,一台设备上可以有多个网卡,每个网卡都有自己的MAC地址,这个地址一般情况下是不会改变的。同时每个网卡正常工作时还会绑定一个唯一的IP地址,这个IP地址是可变的。而在设备上运行的各种应用程序或者服务都拥有自己的端口号。一台设备上不同网络应用程序必须有不同的端口号,A程序启动了使用了端口x,B程序启动就不能使用端口x,否则会报错"Address already in use"。
建立一个互联网网络通讯,发送和接收双方都需要知道对方的IP地址和端口号,同时要知道协议的类型(如:TCP)。所以总的来说,操作系统是通过源IP地址、目标IP地址、协议号(协议类型)、源端口号以及目标端口号这五个元素识别一个唯一的网络通信。
一条通讯信息中IP和端口号的存储位置大概如下:
一台主机最多保持多少个连接
通过上面我们知道,一台设备最多有65536个可用端口,而且没个端口只能有一个应用程序绑定。同时当客户端和服务端链接的时候,客户端也要分配一个端口的,那么一台主机是不是最多只能保持65536个连接?
这个理论是错误的 。我们以连接mysql为例(只考虑服务端和客户端都只有一个IP的情况):
服务端方面:
我们知道,一个唯一网络通讯是通过上面所述的"五元组"来确认的,这里确定了使用TCP协议,那么就变成了TCP网络连接四元组。
试想一下,服务器启动一个服务,此时有哪几个元素是固定下来的?是目标IP地址和目标端口号 。我们知道,当TCP四元组中任何一个元素发生改变,都会产生一个新的连接。这里可以变更的是源IP地址和源端口号 ,大多情况下IP地址是一个32位的整数,总数位2的32次方。而端口号是16位整数,为2的16次方。2 的 32 次方(ip数)× 2的 16 次方(port数)大约等于两百多万亿。所以理论上,我们每个 server 可以接收的连接上限就是两百多万亿。当然实际环境中,支持不了这么大的连接,就java来说大概能支撑到百万级别。
客户端方面:
客户端的端口号大多情况下并不需要应用程序特殊分配,而可以全权交给系统机型分配。那基于这种理论,操作系统最多只有65535个可用端口,那是不是客户端最多只能同时保持65535个连接?
这个理论也是错误的 ,还是基于上面的TCP四元组 来说,其实当客户端方位服务端的过程,唯一确定的元素是源IP地址,而其他三个元素都是可变的。所以,可以说客户端可以保持的连接数,理论值还要远远大于服务端。
TCP特性详解
TCP(Transmission Control Protocol,传输控制协议)是互联网协议族(Internet Protocol Suite)中的核心协议之一,旨在提供可靠、面向连接、基于字节流的传输服务。以下是TCP的主要特性:
- 面向连接 :
- TCP在传输数据之前必须先建立连接,数据传输结束后需要释放连接。
- 通过三次握手(Three-way Handshake)建立连接,通过四次挥手(Four-way Handshake)释放连接。
- 可靠性 :
- TCP通过校验和、序列号、确认应答、重传控制、连接管理以及流量控制等机制来实现可靠性传输。
- 校验和用于检测传输的数据是否有误。
- 序列号用于确保数据按正确的顺序到达目的地。
- 确认应答(ACK)用于确认接收到的数据。
- 重传控制用于在数据丢失时重新发送数据。
- 全双工 :
- TCP允许数据在两个方向上同时传输,即全双工通信。
- 基于字节流 :
- TCP不关心应用程序一次写入的字节的多少,它会根据当前网络状况、对端接收情况等因素决定实际发送的数据大小。
- 流量控制 :
- TCP通过滑动窗口(Sliding Window)机制来实现流量控制,确保发送方发送数据的速率不会超过接收方的接收能力。
- 拥塞控制 :
- TCP通过慢开始、拥塞避免、快重传和快恢复等算法来避免网络拥塞,确保网络的稳定性和可靠性。
- 可靠性增强机制 :
- TCP提供了超时重传、选择确认(Selective Acknowledgment, SACK)等机制来进一步提高数据传输的可靠性。
- 安全性 :
- 虽然TCP本身并不提供加密功能,但它可以与SSL/TLS等安全协议结合使用,为传输的数据提供加密和身份验证功能。
- 错误处理 :
- TCP能够处理各种网络错误,如网络拥塞、硬件故障等,并采取相应的措施进行恢复。
- 网络透明性:
- TCP对应用程序是透明的,即应用程序不需要关心网络的底层细节,只需要按照TCP的接口规范进行编程即可。
TCP的这些特性使得它非常适合用于需要可靠数据传输的应用场景,如文件传输、电子邮件、远程登录等。
TCP三次握手
TCP三次握手是为了确保客户端和服务器之间能够建立可靠的连接,并交换必要的连接信息。以下是TCP三次握手的详细过程:
第一次握手
- 发起方(客户端) :
- 发送一个SYN(同步)包给接收方(服务器),并设置SYN标志位为1。
- 随机产生一个初始序列号(seq=x),并设置该序列号在SYN包中。
- 此时,客户端进入SYN_SENT(同步已发送)状态,等待服务器的响应。
第二次握手
- 接收方(服务器) :
- 收到客户端发来的SYN包后,检查SYN标志位,并确认这是一个连接请求。
- 发送一个SYN+ACK(同步+确认)包给客户端,以确认连接请求。
- 在SYN+ACK包中,设置SYN和ACK标志位都为1。
- 设置确认号(ack)为客户端发送的序列号加1(ack=x+1),表示对客户端SYN包的确认。
- 随机产生一个自己的初始序列号(seq=y),并设置该序列号在SYN+ACK包中。
- 此时,服务器进入SYN_RECV(同步已接收)状态,等待客户端的最终确认。
第三次握手
- 发起方(客户端) :
- 收到服务器发来的SYN+ACK包后,检查确认号(ack)和ACK标志位,确保与预期一致。
- 发送一个ACK包给服务器,表示对服务器SYN+ACK包的最终确认。
- 在ACK包中,设置ACK标志位为1。
- 设置确认号(ack)为服务器发送的序列号加1(ack=y+1),表示对服务器SYN+ACK包的确认。
- 设置自己的序列号(seq)为上一个包中发送的序列号加1(seq=x+1),表示这是继续上一个数据包的发送。
- 此时,客户端和服务器都进入ESTABLISHED(已建立连接)状态,可以进行数据传输了。
总结
TCP三次握手过程通过三个步骤,确保客户端和服务器之间建立了可靠的连接,并交换了必要的连接信息。这个过程通过SYN、SYN+ACK和ACK三种类型的包来实现,每个包都包含特定的标志位和序列号信息,用于确认连接请求和交换序列号。三次握手完成后,客户端和服务器之间就可以开始传输数据了。
补充
为了更直观的理解这个过程,并且也验证一下上面的论述。这里使用WireShark 进行抓包观测,我们以连接mysql数据库为例。
这里的数据库IP地址为 192.168.1.110,而本机地址为192.168.1.107。
首先打开WireShark,选择对应的连接,并设置过滤器,这里只观测192.168.1.110的信息:
双击对应的连接(WLAN)开始测试:
可以看到,因为还没有192.168.1.110相关的信息,这里没有展示任何信息。此时我们连接mysql(这里直接使用navicat):
点击连接后,查看WireShark,发现已经有数据了,这里主要是观测TCP三次握手过程,所以只看前三条就可以了,如图:
从第一次握手开始,点击第一条,下面展示其对应的信息:
我们先从数据链路层开始,即下面部分:
可以看到,Source中的地址和我们的MAC地址是一致的。
接下来是IP层部分(网络层):
可以看到,这部分包含了源IP地址和目标IP地址,并指明了TCP协议号。这里也可以验证我们之前的论述。
最后让我们看一下TCP层(传输层):
其中的源端口号位63939,目标端口号位3306。
这里是第一次握手的信息,显示为SYN包,同时Syn标识位设置值为1,并且用一个随机数作为Seq序列号,发送给服务端。
接下来看第二次握手的信息:
数据链路层和IP层数据雷同,就不再赘述了。这里看TCP层信息。
可以看到,因为第二次握手时服务端发给客户端的,所以这里的源端口号和目标端口号与第一次握手时相反。主要看下面的信息。能够看到,这里为SYN+ACK包,其中的ACK标识位和SYN标识位都设置为1。而ack序列号为3540691487,这个值为第一次握手时sqe序列号加1得到,同时用一个随机的数字,作为自己的seq发送给客户端。
最后,我们看一下第三次握手:
可以看到是一个ACK包,ACK位被置为1。其中的seq序列号为第一次握手的seq加1,而ack序列号为第二次握手中seq的值加1。
通过上面实际观察TCP报文,已经很直观的看到了TCP三次握手的过程。下面再看一下四次挥手。
TCP四次挥手
TCP四次挥手(Four-Way Handshake)是TCP连接断开过程中的步骤,用于确保两个通信的端点(客户端和服务器)都能确认连接的关闭,保证数据的可靠传输直到双方都准备好关闭连接。四次挥手的过程如下:
第一次挥手
- 客户端发送FIN报文段:客户端(假设为A)决定关闭连接,会发送一个FIN(结束)报文段给服务器端(假设为B)。这个FIN报文段中包含客户端的序列号(seq),这个序列号等于之前传输的最后一个字节的序列号加1(假设为u)。
- 客户端状态:客户端进入FIN_WAIT1状态,等待服务器端的确认。
第二次挥手
- 服务器端发送ACK报文段:服务器端(B)收到客户端(A)的FIN报文段后,会发送一个ACK报文段作为响应。这个ACK报文段的确认号(ack)等于客户端FIN报文段的序列号加1(即ack=u+1),表示服务器端已经收到了客户端的FIN报文段。
- 服务器端状态:服务器端进入CLOSE_WAIT状态,表示服务器已经收到了客户端的关闭请求,但服务器可能还有数据需要发送给客户端。
第三次挥手
- 服务器端发送FIN报文段:当服务器端(B)完成所有数据传输后,决定关闭连接,会发送一个FIN报文段给客户端(A)。这个FIN报文段中包含服务器端的序列号(seq),这个序列号等于之前传输的最后一个字节的序列号加1(假设为w)。
- 服务器端状态:服务器端进入LAST_ACK状态,等待客户端的确认。
第四次挥手
- 客户端发送ACK报文段:客户端(A)收到服务器端(B)的FIN报文段后,会发送一个ACK报文段作为响应。这个ACK报文段的确认号(ack)等于服务器端FIN报文段的序列号加1(即ack=w+1),表示客户端已经收到了服务器端的FIN报文段。
- 客户端状态:客户端进入TIME_WAIT状态,等待一段时间后(通常是2倍的MSL,即报文段最大生存时间),客户端进入CLOSED状态,连接完全关闭。
- 服务器端状态:服务器端收到客户端的ACK报文段后,进入CLOSED状态,连接完全关闭。
为什么需要四次挥手
四次挥手的原因在于,TCP连接是全双工的,所以每个方向的关闭都需要独立进行。第一次和第二次挥手处理的是客户端停止发送数据,而第三次和第四次挥手处理的是服务器停止发送数据。此外,第四次挥手的目的是确保服务器确实收到了客户端的确认,避免因为网络延迟或丢失ACK而导致服务器认为连接没有关闭,从而防止资源的不必要占用。这就是为什么TCP挥手需要四次交互,以确保连接的可靠关闭。
为什么需要TIME-WAIT状态
TIME-WAIT状态在TCP协议中扮演着至关重要的角色,其存在的原因可以归纳为以下几点:
- 确保全双工连接的正确中断:
- TCP是全双工协议,即数据可以在两个方向上同时传输。TIME-WAIT状态确保了即使在网络中存在延迟的情况下,主动关闭方(通常是客户端)发送的最后一个ACK报文段也能被对方(通常是服务器)成功接收。这避免了因ACK报文段丢失而导致的服务器端处于LAST_ACK状态,从而可能导致后续连接建立时的混淆和错误。
- 防止旧报文段干扰新连接:
- 在TCP连接关闭后,可能还有旧的报文段在网络中滞留。如果没有TIME-WAIT状态,这些旧的报文段可能会被错误地应用于新的连接,导致数据混乱或连接异常。TIME-WAIT状态的存在确保了足够的时间让旧的报文段从网络中消失,从而避免了对新连接的干扰。
- 确保连接可靠关闭:
- TIME-WAIT状态确保了在连接关闭过程中,所有的TCP报文段都能被正确地处理和确认。这包括确保主动关闭方发送的FIN报文段和ACK报文段都能被对方成功接收,以及确保被动关闭方发送的FIN报文段也能被主动关闭方成功接收并确认。这种机制确保了连接的可靠关闭,避免了因网络延迟或报文段丢失而导致的连接异常终止。
- 等待时间:
- TIME-WAIT状态通常持续的时间是2MSL(Maximum Segment Lifetime,报文段最大生存时间)。这个时间足够让两个方向上的数据包都被丢弃,确保原来连接的数据包在网络中都自然消失。这样,再出现的数据包一定都是新建立连接所产生的,从而避免了新旧连接之间的混淆。
- 安全性考虑:
- TIME-WAIT状态还可以防止一些潜在的安全问题。例如,它可以防止一种被称为"截断攻击"的攻击方式,即攻击者通过发送伪造的RST报文段来强制关闭一个TCP连接。如果没有TIME-WAIT状态,攻击者可能会利用这种攻击方式来干扰正常的TCP连接。
综上所述,TIME-WAIT状态在TCP协议中起到了至关重要的作用。它确保了全双工连接的正确中断、防止了旧报文段对新连接的干扰、确保了连接的可靠关闭,并提供了额外的安全性保障。
UDP介绍
UDP(User Datagram Protocol,用户数据报协议)是一个无连接的传输层协议,与TCP(Transmission Control Protocol,传输控制协议)相比,UDP提供了不同的服务模型。以下是UDP的主要特点和为什么需要UDP的原因:
UDP的特点
- 无连接:UDP是一个无连接的协议,它不像TCP那样需要建立、保持和终止连接。发送方和接收方在发送数据之前不需要进行握手,因此UDP的通信效率更高,适用于对实时性要求较高的应用。
- 不可靠传输:UDP不提供数据包的排序、错误检查、重传等机制,因此它是不可靠的。发送方只是简单地将数据包发送到网络上,而接收方也只是简单地接收数据包。如果数据包在传输过程中丢失或损坏,UDP不会进行任何补救。这种不可靠性在某些场景下是可以接受的,如流媒体、实时通信等。
- 面向数据报:UDP将应用程序交下来的报文截成多个合适的片段,并为每个片段加上UDP头和IP头后在网络中进行传输。这些片段(报文)到达接收端时,UDP只负责将它们送到应用程序,而不负责重新排序。
- 开销小、速度快:由于UDP没有复杂的连接建立和保持机制,因此它的开销较小,传输速度较快。这使得UDP非常适合用于需要高速传输的应用,如网络游戏、实时音视频传输等。
为什么需要UDP
- 实时性要求高的应用:对于实时性要求很高的应用,如在线游戏、实时音视频通话等,TCP的可靠传输机制可能会导致较大的延迟。而UDP的无连接和不可靠传输特性使得它能够更快地传输数据,满足实时性要求。
- 对可靠性要求不高的应用:有些应用对数据的可靠性要求不高,如实时股票行情、网络广播等。这些应用可以容忍一定的数据丢失或错误,因此可以使用UDP进行传输。
- 资源受限的环境:在资源受限的环境中,如嵌入式系统、物联网设备等,TCP的复杂性和开销可能不适合。而UDP的简单性和轻量级使得它成为这些环境下的更好选择。
- 应用层实现可靠性:虽然UDP本身不提供可靠性保证,但应用层可以在UDP的基础上实现可靠性机制。例如,应用层可以使用序列号、确认机制、重传机制等来实现数据的可靠传输。这使得UDP在需要时可以通过应用层的扩展来实现可靠性。
总之,UDP提供了与TCP不同的服务模型,适用于对实时性要求高、对可靠性要求不高或资源受限的应用场景。通过合理使用UDP,可以实现更高效、更灵活的网络通信。
UDP单播和广播
UDP单播和广播是UDP协议中两种不同的通信方式,它们在网络通信中扮演着不同的角色。以下是关于UDP单播和广播的详细解释:
UDP单播(Unicast)
定义 :
UDP单播是指封包在计算机网络的传输中,目的地址为单一目标的一种传输方式。在这种方式下,每次只有两个实体相互通信,发送端和接收端都是唯一确定的。
特点:
- 唯一性:每次通信的发送端和接收端都是唯一确定的。
- 地址范围:在IPv4网络中,0.0.0.0到223.255.255.255的IP地址范围属于单播地址。
- 广泛应用:现今网络应用最为广泛,通常所使用的网络协议或服务大多采用单播传输,例如一切基于TCP的协议。
UDP广播(Broadcast)
定义 :
UDP广播是指由一台主机向该主机所在子网内(同一个局域网)的所有主机发送数据的方式。
特点:
- 广播地址:广播使用广播地址255.255.255.255,将消息发送到在同一广播网络上的每个主机。
- 局域网内通信:广播地址通常用于在网络游戏中处于同一本地网络的玩家之间交流状态信息等。需要注意的是,广播信息不会被路由器转发,这是为了防止广播信息引起网络瘫痪。
- 端口号指定:广播时,需要指明接收者的端口号,因为不可能让接收者的所有端口都来收听广播。