计算机网络体系
OSI 七层模型
OSI 采用了分层的结构化技术,共分七层,物理层、数据链路层、网络层、传输层、会 话层、表示层、应用层
TCP/IP 五层模型
OSI 模型比较复杂且学术化,所以我们实际使用的 TCP/IP 模型,分 5 层,物理层、数据 链路层(也有 TCP/IP 模型将物理层、数据链路层合称为网络接口层,与之对应的,协议就 被称为 TCP/IP 四层协议模型)、网络层、传输层、应用层。
TCP/IP协议族
TCP/IP是 Internet 最基本的协议、Internet 国际互联网络的基础,由网络层的 IP 协议和 传输层的 TCP 协议组成。协议采用了 5 层的层级结构。然而在很多情况下,它是利用 IP 进 行通信时所必须用到的协议群的统称。也就是说,它其实是个协议家族,由很多个协议组成, 并且是在不同的层, 是互联网的基础通信架构。
IP、TCP、UDP区别
- IP往往是用来确定网络中唯一的设备,就好比我们生活中的电话号码。它对应着网络层,这层负责对数据加上IP地址(发送方的主机IP和接收方的主机IP)和其他数据已确定传输的目标。
- TCP和UDP都属于传输层协议,传输层主要为两台主机上的应用程序提供端到端的通信。
- TCP 提供了一种可靠的数据传输服务,TCP 是面向连接的,也就是说,利用 TCP 通信的两台 主机首先要经历一个建立连接的过程(3次握手),等到连接建立后才开始传输数据,而且传输过程中采 用“带重传的肯定确认”技术来实现传输的可靠性。TCP 还采用一种称为“滑动窗口”的方式进 行流量控制,发送完成后还会关闭连接(四次挥手)。
- UDP 是把数据直接发出去,而不管对方是不是在接收,也不管对方是否能接收的了,也不需要接收方确认,属于不可靠的传输,可能会出现丢包现象。 从可靠性来讲TCP比UDP要可靠的多。
TCP/IP 网络传输过程
- 用户 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 应用程序的处理 接收端应用程序会直接接收发送端发送的数据。通过解析数据,展示相应的内容。
TCP特性
TCP三次握手
- 第一次握手:客户端将请求报文标志位 SYN 置为 1,请求报文的 seq 字段中填入一个随机值J,并将该数据包发送给服务器端,客户端进入 SYN_SENT 状 态,等待服务器端确认。
- 第二次握手:服务器端收到数据包后由请求报文标志位 SYN=1 知道客户端请求建立连接,服务器端将应答报文标志位 SYN 和 ACK 都置为 1,应答报文的 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 握手需要三次?
- TCP 是可靠的传输控制协议,而三次握手是保证数据可靠传输又能提高传输效率的最小次数。为了实现可靠数据传输, TCP 协议的通信双方,都必须维护一个序列号, 以标识发送出去的数据包中,哪些是已经被对方收到的。
- 三次握手的过程即是通信双方相互告知序列号起始值,并确认对方已经收到了序列号 起始值的必经步骤。
- 如果只是两次握手, 至多只有连接发起方的起始序列号能被确认, 另一方选择的序列 号则得不到确认。
TCP四次挥手
- 某个应用进程首先调用 close,我们称该端执行主动关闭。该端的 TCP 于是发送一个 FIN 分节,表示数据发送完毕,应用进程进入 FIN-WAIT-1(终止等待 1)状态。
- 接收到这个 FIN 的对端执行被动关闭(passive close),发出确认报文。因为 FIN 的接 收意味着接收端应用进程在相应连接上再无额外数据可接收,接收端进入了 CLOSE-WAIT(关 闭等待)状态,这时候处于半关闭状态,即主动关闭端已经没有数据要发送了,但是被动关 闭端若发送数据,主动关闭端依然要接受。这个状态还要持续一段时间,也就是整个 CLOSE-WAIT 状态持续的时间。主动关闭端收到确认报文后进入 FIN-WAIT-2(终止等待 2)状 态。
- 一段时间后,被动关闭的应用进程将调用 close 关闭它的套接字。这导致它的 TCP 也 发送一个 FIN,表示它也没数据需要发送了。
- 接收这个最终 FIN 的原发送端 TCP(即执行主动关闭的那一端)确认这个 FIN 发出一 个确认 ACK 报文,并进入了时间等待状态。注意此时 TCP 连接还没有释放, 必须经过 2∗MSL(最长报文段寿命/最长分节生命期 max segement lifetime,MSL 是任何 IP 数据报能够在因特网中存活的最长时间,任何 TCP 实现都必须为 MSL 选择一个值。RFC 1122[Braden 1989]的建议值是 2 分钟,不过源自 Berkelcy 的实现传统上改用 30 秒这个值。 这意味着 TIME_WAIT 状态的持续时间在 1 分钟到 4 分钟之间)的时间后,当主动关闭端撤 销相应的 TCB 后,才进入 CLOSED 状态。
- 被动关闭端只要收到了客户端发出的确认,立即进入 CLOSED 状态。同样,撤销 TCB 后,就结束了这次的 TCP 连接。可以看到,被动关闭端结束 TCP 连接的时间要比主动关闭 端早一些。
为什么 TCP 的挥手需要四次?
- TCP 是全双工的连接,必须两端同时关闭连接,连接才算真正关闭。
- 如果一方已经准备关闭写,但是它还可以读另一方发送的数据。发送给 FIN 结束报文给 对方,对方收到后,回复 ACK 报文。当这方也已经写完了准备关闭,发送 FIN 报文,对方回 复 ACK。两端都关闭,TCP 连接正常关闭。