目录
计算机网络是什么?
定义和分类
计算机网络发展简史
计算机网络体系结构
OSI 七层模型
TCP/IP 模型
TCP/IP 协议族
TCP/IP 网络传输中的数据
地址和端口号
MAC地址
IP 地址
端口号
为什么端口号有65535个?
综述
TCP 特性
TCP 三次握手
为什么TCP握手需要三次?
TCP三次握手之洪泛攻击
TCP 四次挥手
为什么TCP的挥手需要四次?
随着计算机技术发展,计算机的体积和价格都在下降,之前计算机多用于研究机构,现阶段逐步进入一般的公司用于办公。原来计算机之间传输数据需要通过软盘等第三方存储介质进行转存,人们需要将数据直接通过通信线路传输,来缩短传输时间,于是计算机网络开始诞生,并逐渐发展为现在巨大的Internet。
计算机网络的标准定义是:利用通信线路将地理上分散的、具有独立功能的计算机系统和通信设备按不同的形式连接起来,以功能完善的网络软件及协议实现资源共享和信息传递的系统。
计算机网络从覆盖范围上划分可以分为三类:局域网、城域网、广域网。局域网 LAN(作用范围一般为几米到几十公里)、城域网 MAN(界于 WAN 与 LAN 之间)、广域网 WAN(作用范围一般为几十到几千公里)。当然计算机网络划分不止这一种分类方式,可以按拓扑结构分类(总线型、环型、星型、网状)、还可以按按信息的交换方式(电路交换、报文交换、报文分组交换)来分等等方式。
1、诞生阶段,20 世纪 60 年代中期之前的第一代计算机网络是以单个计算机为中心的远程联机系统。
2、ARPANET,多个主机通过通信线路互联起来。60年代初。当时,美国国防部为了保证美国本土防卫力量和海外防御武装在受到前苏联第一次核打击以后仍然具有一定的生存和反击能力,认为有必要设计出一种分散的指挥系统;它由一个个分散的指挥点组成,当部分指挥点被摧毁后,其它点仍能正常工作,并且在这些点之间能够绕过那些已被摧毁的指挥点而继续保持联系。这个设计出发点很重要,理解了它,就能够理解为何后面要学习的 TCP 要这么设计。为了对这一构思进行验证,1969 年,美国国防部国防高级研究计划署 (DOD/DARPA)资助建立了一个名为 ARPANET(即"阿帕网")的网络,将多个大学的计算机主机 联接起来,位于各个结点的大型计算机采用分组交换技术,通过专门的通信交换机和专门的通信线路相互连接。E-mail、FTP 和 Telnet 在 ARPANET 上已经诞生。
3、开放性的标准化体系结构,OSI 诞生。ARPANET 兴起后,计算机网络发展迅猛,各大计算机公司相继推出自己的网络体系结构及实现这些结构的软硬件产品。由于没有统一的标准,不同厂商的产品之间互联很困难,人们迫切需要一种开放性的标准化实用网络环境,这样应运而生了两种国际通用的最重要的体系结构,为了实现网络设备间的互相通讯,ISO 和 IEEE(电气和电子工程师协会,是世界上最大的非营利性专业技术学会)相继提出了 OSI 参考模 型及其 TCP/IP 模型。由于 TCP/IP 尽早地制定了可行性较强的协议,提出了应对技术快速革新的协议,并及时进行后期改良的方案,因此打败了 OSI 模型,成为了事实上的标准。
4、Internet 互联网 20 世纪 90 年代至今的第四代计算机网络,就是我们所熟知的 Internet 互联网。 既然网络是很多的计算设备(电脑、手机等等)连接在一起的,这些计算设备来自不同的公司,有不同的体系结构,相互之间如何通信呢?这就好比我们的语言,中国地广人多,地方性语言也非常丰富,而且方言之间差距巨大。A 地区的方言可能 B 地区的人根本无法听懂,所以要为全国进行沟通建立一个语言标准,这就是我们的普通话的作用。计算机网络协议同我们的普通话一样,帮助我们的计算机之间进行沟通。
无论什么模型,每一个抽象层建立在低一层提供的服务上,并且为高一层提供服务。对于我们的PC机来说,物理层可以看成网卡,数据链路层可以看成网卡驱动程序,网络层和传输层由操作负 责处理,应用层则是常用的一些网络应用程序和我们自己所编写的网络应用程序。
Transmission Control Protocol/Internet Protocol 的简写,中译名为传输控制协议/因特网 互联协议,是 Internet 最基本的协议、Internet 国际互联网络的基础,由网络层的 IP 协议和 传输层的 TCP 协议组成。协议采用了 5 层的层级结构。然而在很多情况下,它是利用 IP 进 行通信时所必须用到的协议群的统称。也就是说,它其实是个协议家族,由很多个协议组成,并且是在不同的层,是互联网的基础通信架构。
IP是TCP/IP中非常重要的协议,往往用来确定网络中唯一的一台计算设备,它的作用就好比我们现实生活中的电话号码或者或者通讯地址。所以这层负责对数据加上IP地址(有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址))和其他的数据以确定传输的目标。而TCP和UDP都是传输层的协议,传输层主要为两台主机上的应用程序提供端到端的通信。
① 用户A应用程序处理首先应用程序会进行编码处理产生报文/消息(message)交给下面的 TCP 层。
② 用户A TCP 模块的处理TCP根据应用的指示,负责建立连接、发送数据以及断开连接。TCP提供将应用层发来的数据顺利发送至对端的可靠传输。为了实现这一功能,需要将应用层数据封装为报文段(segment)并附加一个TCP首部然后交给下面的IP层。
③ 用户A IP模块的处理IP将TCP传过来的TCP首部和TCP数据合起来当做自己的数据,并在TCP首部的前端加上自己的IP首部生成IP数据报(datagram)然后交给下面的数据链路层。
④ 用户A数据链路层的处理从IP传过来的IP包对于数据链路层来说就是数据。给这些数据附加上链路层首部封装为链路层帧(frame),生成的链路层帧(frame)将通过物理层传输给接收端。
⑤ 用户B数据链路层的处理用户B主机收到链路层帧(frame)后,首先从链路层帧(frame)首部找到MAC地址判断是否为发送给自己的包,若不是则丢弃数据。如果是发送给自己的包,则从以太网包首部中的类型确定数据类型,再传给相应的模块,如 IP、ARP等。这里的例子则是IP 。
⑥ 用户B IP模块的处理IP模块接收到数据后也做类似的处理。从包首部中判断此IP地址是否与自己的IP地址匹配,如果匹配则根据首部的协议类型将数据发送给对应的模块,如 TCP、UDP。这里的例子则是TCP。
⑦ 用户B TCP模块的处理在TCP模块中,首先会计算一下校验和,判断数据是否被破坏。然后检查是否在按照序号接收数据。最后检查端口号,确定具体的应用程序。数据被完整地接收以后,会传给由端口号识别的应用程序。
⑧ 用户B应用程序的处理接收端应用程序会直接接收发送端发送的数据。通过解析数据,展示相应的内容。
MAC地址全称叫做媒体访问控制地址,也称为局域网地址(LAN Address),MAC 位址,以太网地址(Ethernet Address)或物理地址(Physical Address),由网络设备制造商生产时写在硬件内部。MAC 地址与网络无关,也即无论将带有这个地址的硬件(如网卡、集线器、路由器等)接入到网络的何处,都有相同的 MAC 地址,它由厂商写在网卡的 BIOS 里,从理论上讲,除非盗来硬件(网卡),否则是没有办法冒名顶替的。
MAC 地址共 48 位(6 个字节)。前 24 位由 IEEE(电气和电子工程师协会)决定如何分 配,后 24 位由实际生产该网络设备的厂商自行制定。例如:FF:FF:FF:FF:FF:FF 或 FF-FF-FF-FF-FF-FF
IP 地址(Internet Protocol Address)的全称叫作互联网协议地址,它的本义是为互联网上的每一个网络和每一台主机配置一个唯一的逻辑地址,用来与物理地址作区分。所以 IP 地址用来识别 TCP/IP 网络中互连的主机和路由器。IP 地址基于逻辑,比较灵活,不受硬件限制,也容易记忆。IP 地址分为:IPv4 和 IPv6。
在传输层也有这种类似于地址的概念,那就是端口号。端口号用来识别同一台计算机中进行通信的不同应用程序。因此,它也被称为程序地址。一台计算机上同时可以运行多个程序。传输层协议正是利用这些端口号识别本机中正在进行通信的应用程序,并准确地将数据传输。
因为在 TCP、UDP 协议报文的开头,会分别有 16 位二进制来存储源端口号和目标端口号,所以端口个数是 2^16=65536 个,但是 0 号端口用来表示所有端口,所以实际可用的端口号是 65535 个。
一般来说,不管计算机中有多少网卡,每个网卡都会有自己的 MAC 地址,这个 MAC 地址是不会变化的。而每个网卡在正常工作的情况下,都会有一个 IP 地址,这个 IP 地址完全是可以变化的。而这台计算机中承载的各种应用程序可以拥有自己的端口号,然后通过服务器的网卡,正确地进行网络通信。
一台服务器上的不同网络应用程序必须有不同的端口号,A 程序启动了使用了端口 x, B 程序启动就不能使用端口 x,否则会报错“Address already in use”。总的来说,操作系统是通过源 IP 地址、目标 IP 地址、协议号(协议类型)、源端口号以及目标端口号这五个元素唯一性的识别一个网络上的通信。
TCP(Transmission Control Protocol)是面向连接的通信协议,通过三次握手建立连接,然后才能开始数据的读写,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端的通讯。
TCP 提供的是一种可靠的数据流服务,数据有可能被拆分后发送,那么采用超时重传机制是和应答确认机制是组成 TCP 可靠传输的关键设计。
TCP 允许在一个 TCP 连接上,通信的双方可以同时传输数据,也就是所谓的全双工。
三次握手是指建立一个 TCP 连接时需要客户端和服务器端总共发送三个包以确认连接的建立。在 socket 编程中,这一过程由客户端执行 connect 来触发,所以网络通信中,发起连接的一方我们称为客户端,接收连接的一方我们称之为服务端。
第一次握手:客户端将请求报文标志位 SYN 置为 1,请求报文的 Sequence Number 字段 (简称 seq)中填入一个随机值 J,并将该数据包发送给服务器端,客户端进入 SYN_SENT 状 态,等待服务器端确认。
第二次握手:服务器端收到数据包后由请求报文标志位 SYN=1 知道客户端请求建立连接,服务器端将应答报文标志位 SYN 和 ACK 都置为 1,应答报文的 Acknowledgment Number 字段(简称 ack)中填入 ack=J+1,应答报文的 seq 中填入一个随机值 K,并将该数据包发送给客户端以确认连接请求,服务器端进入 SYN_RCVD 状态。
第三次握手:客户端收到应答报文后,检查 ack 是否为 J+1,ACK 是否为 1,如果正确则将第三个报文标志位 ACK 置为 1,ack=K+1,并将该数据包发送给服务器端,服务器端检查 ack 是否为 K+1,ACK 是否为 1,如果正确则连接建立成功,客户端和服务器端进入 ESTABLISHED 状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。
TCP 是可靠的传输控制协议,而三次握手是保证数据可靠传输又能提高传输效率的最小次数。三次握手的过程即是通信双方相互告知序列号起始值,并确认对方已经收到了序列号起始值的必经步骤。如果只是两次握手,至多只有连接发起方的起始序列号能被确认,另一方选择的序列 号则得不到确认。
三次握手中有一个第二次握手,服务端向客户端应答请求,应答请求是需要客户端 IP 的,而且因为握手过程没有完成,操作系统使用队列维持这个状态。于是攻击者就伪造这个 IP,往服务器端狂发送第一次握手的内容,当然第一次握手中的客户端 IP 地址是伪造的,从而服务端忙于进行第二次握手,但是第二次握手是不会有应答的,所以导致服务器队列满,而拒绝连接。
解决方案:
无效连接监视释放
不停监视所有的连接,包括三次握手的,还有握手一次的,反正是所有的,当达到一定(与)阈值时拆除这些连接,从而释放系统资源。这种方法对于所有的连接一视同仁,不管是正常的还是攻击的,所以这种方式不推荐。
延缓TCB分配方法
做完第一次握手之后,服务器就需要为该请求分配一个TCB(连接控制资源),通常这个资源需要200多个字节。延迟TCB的分配,当正常连接建立起来后再分配TCB则可以有效地减轻服务器资源的消耗。
使用防火墙
防火墙在确认了连接的有效性后,才向内部的服务器(Listener)发起 SYN 请求。
1. 某个应用进程首先调用 close,我们称该端执行主动关闭(active close)。该端的 TCP 于是发送一个 FIN 分节,表示数据发送完毕,应用进程进入 FIN-WAIT-1(终止等待 1)状态。
2. 接收到这个 FIN 的对端执行被动关闭(passive close),发出确认报文。因为 FIN 的接 收意味着接收端应用进程在相应连接上再无额外数据可接收,接收端进入了 CLOSE-WAIT(关闭等待)状态,这时候处于半关闭状态,即主动关闭端已经没有数据要发送了,但是被动关闭端若发送数据,主动关闭端依然要接受。这个状态还要持续一段时间,也就是整个 CLOSE-WAIT 状态持续的时间。主动关闭端收到确认报文后进入 FIN-WAIT-2(终止等待 2)状态。
3. 一段时间后,被动关闭的应用进程将调用 close 关闭它的套接字。这导致它的TCP也发送一个 FIN,表示它也没数据需要发送了。
4. 接收这个最终 FIN 的原发送端 TCP(即执行主动关闭的那一端)确认这个 FIN 发出一个确认 ACK 报文,并进入了 TIME-WAIT(时间等待)状态。注意此时 TCP 连接还没有释放,必须经过 一定的时间后(2MSL),当主动关闭端撤销相应的TCB后,才进入CLOSED 状态。
5. 被动关闭端只要收到了客户端发出的确认,立即进入 CLOSED 状态。同样,撤销 TCB 后,就结束了这次的 TCP 连接。可以看到,被动关闭端结束 TCP 连接的时间要比主动关闭端早一些。
TCP 是全双工的连接,必须两端同时关闭连接,连接才算真正关闭。
如果一方已经准备关闭写,但是它还可以读另一方发送的数据。发送给 FIN 结束报文给对方,对方收到后,回复 ACK 报文。当这方也已经写完了准备关闭,发送 FIN 报文,对方回复 ACK。两端都关闭,TCP 连接正常关闭。