网络概念
DNS 查询等收发较短的控制数据时用UDP.
IP中还包括ICMP协议和ARP协议。
ICMP用于告知网络包传送过程中产生的错误以及各种控制信息
ARP协议用于根据IP地址查询相应的以太网MAC地址
套接字中记录了通信双方的信息以及通信处于怎样的状态。
连接( connect)实际上是通信双方交换控制信息。
把服务器的 IP 地址和端口号等信息告知协议栈,这是连接操作的目的之一。
客户端向服务器传达开始通信的请求(包含客户端的ip,端口等信息),也是连接操作的目的之一。
当执行数据收发操作时,我们还需要一块用来临时存放要收发的数据的内存空间,这块内存空间称为缓冲区,它也是在连接操作的过程中分配的。上面这些就是“连接”这个词代表的具体含义。
控制信息其实可以大致分为两类:1.客户端和服务器相互联络时交换的控制信息。 2.保存在套接字中,用来控制协议栈操作的信息。
通信操作中使用的控制信息分为两类。
(1) 头部中记录的信息
(2) 套接字(协议栈中的内存空间)中记录的信息
连接操作的第一步是在 TCP 模块处创建表示连接控制信息的头部。
通过 TCP 头部中的发送方和接收方端口号可以找到要连接的套接字。
客户端连接服务器的过程:
当 TCP 头部创建好之后,接下来 TCP 模块会将信息传递给 IP 模块并委托它进行发送。服务器从处于等待连接状态的套接字中找到与 TCP 头部中记录的端口号相同的套接字之后,套接字中会写入相应的信息,并将状态改为正在连接,然后,服务器的 TCP 模块会返回响应,这个过程和客户端一样,需要在 TCP 头部中设置发送方和接收方端口号以及 SYN 比特。此外,在返回响应时还需要将 ACK 控制位设为1 ,这表示已经接收到相应的网络包,而设置ACK 比特就是用来进行确认网络包是否已经送达接下来,服务器 TCP 模块会将 TCP头部传递给 IP 模块,并委托 IP 模块向客户端返回响应。然后,网络包就会返回到客户端,通过 IP 模块到达 TCP 模块,并通过 TCP 头部的信息确认连接服务器的操作是否成功。如果 SYN 为 1 则表示连接成功,这时会向套接字中写入服务器的 IP 地址、端口号等信息,同时还会将状态改为连接完毕。到这里,客户端的操作就已经完成,但其实还剩下最后一个步骤。刚才服务器返回响应时将 ACK 比特设置为 1,相应地,客户端也需要将 ACK 比特设置为 1 并发回服务器,告诉服务器刚才的响应包已经收到。当这个服务器收到这个返回包之后,连接操作才算全部完成。
数据发送的过程:应用程序在调用 write 时会指定发送数据的长度,在协议栈看来,要发送的数据就是一定长度的二进制字节序列而已。协议栈并不是一收到数据就马上发送出去,而是会将数据存放在内部的发送缓冲区中,并等待应用程序的下一段数据。
MTU(最大传输单元):一个网络包的最大长度,以太网中一般为 1500 字节。
MSS(最大分段大小):除去头部之后,一个网络包所能容纳的 TCP 数据的最大长度。下图为说明:
IP 与以太网的包收发操作
(1)路由器根据目标地址判断下一个路由器的位置
(2)集线器在子网中将网络包传输到下一个路由
集线器是按照以太网规则传输包的设备,而路由器是按照 IP规则传输包的设备,即:
(1)IP 协议根据目标地址判断下一个 IP 转发设备的位置
(2)子网中的以太网协议将包传输到下一个转发设备
TCP/IP 网络中,一个网络包从出发到到达目的地的全过程:
网络包在传输过程中会经过集线器,集线器是根据以太网协议工作的设备。为了判断包接下来应该向什么地方传输,集线器里有一张表(用于以太网协议的表),可根据以太网头部中记录的目的地信息查出相应的传输方向。这张图中只有一个集线器,当存在多个集线器时,网络包会按顺序逐一通过这些集线器进行传输。
接下来,包会到达下一个路由器。路由器中有一张 IP 协议的表,可根据这张表以及 IP 头部中记录的目的地信息查出接下来应该发往哪个路由器。为了将包发到下一个路由器,我们还需要查出下一个路由器的 MAC 地址,并记录到 MAC 头部中,大家可以理解为改写了 MAC 头部。这样,网络包就又被发往下一个节点了。
网络包会通过路由器到达下一个路由器。这个过程不断重复,最终网络包就会被送到目的地,当目的地设备成功接收之后,网络包的传输过程就结束了。
无线局域网、ADSL、FTTH 等,它们都可以替代以太网的角色帮助 IP 协议来传输网络包A 。因此,将 IP 和负责传输的网络分开,可以更好地根据需要使用各种通信技术。
IP 模块负责添加如下两个头部。
(1) MAC 头部:以太网用的头部,包含 MAC 地址
(2) IP 头部:IP 用的头部,包含 IP 地址
无论要收发的包是控制包还是数据包,IP 对各种类型的包的收发操作都是相同的。
IP 头部的“接收方 IP 地址”填写通信对象的 IP 地址。 发送方 IP 地址需要判断发送所使用的网卡,并填写该网卡的 IP地址。
MAC 头部是以太网使用的头部,它包含了接收方和发送方的 MAC 地址等信息。
通过 ARP 查询目标路由器的 MAC 地址:在以太网中,有一种叫作广播的方法,可以把包发给连接在同一以太网中的所有设备。ARP 就是利用广播对所有设备提问:“×× 这个 IP 地址是谁的?请把你的 MAC 地址告诉我。”然后就会有人回答:“这个 IP 地址是我的,我的 MAC 地址是××××。”如果对方和自己处于同一个子网中,那么通过上面的操作就可以得到对方的 MAC 地址。
将查询结果放到一块叫作 ARP 缓存的内存空间中留着以后用。ARP 缓存中的值在经过一段时间后会被删除,一般这个时间在几分钟左右。