浅入网络基础
TCP/IP 协议族
TCP/IP
协议族按层次分分为 4 层,分别为应用层、传输层、网络层和数据链路层。
✏️应用层
应用层决定了向用户提供用户服务时通信的活动。
比如:FTP(文件传输协议)、DNS(域名系统)、HTTP
📨传输层
传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。
比如:TCP(传输控制协议),也就是面试经常被问到的三次握手四次挥手;UDP(用户数据报协议)
💻网络层
网络层用来处理在网络上流动的数据包。该层规定了通过怎样的路径(所谓的传输路线)到达对方计算机,并把数据包传送给对方。
🖨️链路层
链路层用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC、及光纤等物理可见部分。
📣TCP/IP通信传输流
发送端在层与层之间传输数据时,每经过一层时必定会被打上一个该层所属的首部信息。反之,接收端在层与层传输时,每经过一层时会把对应的首部消去。
网络体系结构
- C/S结构:通信只在客户与服务器之间进行,客户与客户之间不进行直接通信。
- P2P结构:每个对等端都同时具备 C/S 应用的客户与服务器的特征,是一个服务器与客户的结合体。即 你的电脑 可以是客户端也可能是服务端,比如 BitTorent。
- 混合结构:既有中心服务器的存在,又有对等端(客户)间的直接通信。
IP协议
IP协议的作用是把各种数据包传送给对方。属于网络层。
两个重要条件:IP地址 和 MAC 地址。
- IP地址指明了节点被分配到的地址。
- MAC地址是指网卡所属的固定地址。
注意:别把 IP 和 IP地址弄混。
TCP协议
TCP位于传输层,提供可靠的字节流服务。属于传输层。
套接字:<源 IP 地址, 源端口号, 目的 IP 地址, 目的端口号>
套接字是实现多路复用和分解的关键。(多路复用和多路分解在下面传输层讲)
字节流服务是指,为了方便传输,将大块数据分割成以报文段为单位的数据包进行管理。而可靠的传输服务是指,能够把数据准确可靠地传给对方(即三次握手四次挥手)。
❗❗TCP报文段结构
- 源端口号和目的端口号用于多路复用/分解。
- 序号指报文的序号,因为数据可能会被切成很多份进行传输(分组交换)。
- 确认序号指期望接收的序号,也表示之前的序号已全部正确接收(采用累积确认机制)。
- 保留指今后使用,目前值为0。
- URG指通知系统此报文段中有紧急数据,应尽快传送(相当于高优先级数据)。当URG = 1时,表明紧急指针字段有效,反之0无效。
- ACK指确认序号字段是否有效,当 ACK = 1时有效,反之0无效。✅
- PSH = 1时指尽快将报文段中的数据交付接收应用进程。
- RST = 1时表明 TCP 连接出现严重差错,必须断开重连。
- SYN = 1时表明该报文是一个建立新连接请求控制段或者是通用建立新连接的确认段。✅
- FIN 指用来释放一个 TCP 连接,当 FIN = 1时表示全部已发送完毕,并请求释放连接。
- 接收窗口指接收方愿意或者还可以接收的应用层数据字节数量。(需要了解滑动窗口协议)
- 校验和用来检测该报文段是否出现差错。
🤝🤝🤝三次握手
- 第一次握手:建立连接时,Client 发送SYN报文段(SYN=1,seq=x) 到 Server ,并进入
SYN_SEND
状态,等待 Server 确认。 - 第二次握手:Server 收到 SYN报文段后,确认接收,发回确认报文段(SYNACK报文段,SYN=1,ACK=1,seq=y,ack_seq=x+1),并此时 Server 进入
SYN_RECV
状态。 - 第三次握手:Client 收到 Server 的 SYNACK报文段,向 Server 发送确认报文段(SYNACK报文段,SYN=0,ACK=1,seq=x+1,ack_seq=y+1),此包发送完毕,Client 和 Server 进入
ESTABLISHED
状态,完成三次握手。
注:第一次握手中的 seq 为 表示 Client 报文的起始序号。第二次握手中的 seq 表示 Server 报文的起始序号,ack_seq=x+1,表示 Client 序号 x + 1前的我都收到了,希望收到 x+1 序号的报文。第三次握手同理,只是 SYN 变为 0 是因为连接已经建立。
🖐️🖐️🖐️🖐️四次挥手
- 第一次挥手:Client发送一个 FIN 段(FIN=1, seq=u),用来关闭 Client 到 Server 的数据传送,Client进入
FIN_WAIT_1
状态(只能收数据不能发送数据)。 - 第二次挥手:Server 收到 FIN 段后,发送一个 ACK 段(ACK=1, seq=v, ack_seq=u+1)给 Client,Server进入
CLOSE_WAIT
状态。Client 收到 ACK 段后进入FIN_WAIT_2
状态。 - 第三次挥手:Server 发送完最后一个数据段后,向 Client 发送 FIN 段(FIN=1, ACK=1, seq=w, ack_seq=u+1),用来关闭 Server 到 Client 的数据传送,Server 进入
LAST_ACK
状态。 - 第四次挥手:Client 收到 FIN 段后,Client 进入
TIME_WAIT
状态,接着发送ACK 段(ACK=1, seq=u+1, ack_seq=w+1)给 Server,Server进入CLOSED
状态,释放连接;Client 等待 2MSL 时间,进入CLOSED
状态,释放连接。
注:通俗的说就是第一次挥手 Client 告诉 Server 请求断开连接;第二次挥手 Server 返回给 Client 说收到你的请求,可以关闭(半关闭,关闭了 Client 向 Server 发数据的通道);第三次挥手等 Server 发送完数据后,也向 Client 请求关闭连接;第四次挥手 Client 回复 Server 收到你的请求,同意关闭连接。
UDP 提供无连接、不可靠的数据报传输服务,即无需握手,直接发送数据。DNS服务就是使用 UDP 。使用的是53端口。
套接字:
<目的 IP 地址, 目的端口号>
传输层
传输层的核心任务是为了应用进程之间提供端到端的逻辑通信服务。
传输层主要实现的功能:
- 传输层寻址
- 对应用层报文进行分段和重组
- 对报文进行差错检测
- 实现进程间的端到端的可靠数据传输控制
- 面向应用层实现复用与分解
- 实现端到端的流量控制
- 拥塞控制
传输层的传输使用端口号来寻址。
多路复用与分解:就是支持众多应用程序共用一个传输层协议,并能够将接收到的数据准确交付给不同的应用进程。
💬大致流程为:用户端监听应用程序的端口,哪个有数据待传输则取出(通过报文),打上标识(首部),交给网络层发送给目的主机。目的主机传输层收到数据后分解,解析套接字,交给对应的端口(应用程序)。
DNS服务
DNS 服务是和 HTTP 协议一样位于应用层的协议。它提供域名到 IP 地址之间的解析服务。
简单来说就是,域名 查找 IP 地址 和 IP地址 反查 域名 的服务。
域名解析分为递归解析和迭代解析。
解析
递归解析:代替查询主机或其他域名服务器,进行进一步的域名查询。即你问我我不知道,但它(另一台域名服务器)可能知道,我帮你去问一下。
迭代解析:不会代替查询主机或其他域名服务器,进行进一步的域名查询,只是将下一步要查询的服务器告知查询主机或服务器。即你问我我不知道,但它(另一台域名服务器)可能知道,你去问它吧。
协议与 HTTP协议 的关系👇👇👇