《网络是怎样连接的》阅读笔记(2),计算机网络基础知识小结笔记。

本文深入解析计算机网络连接原理,涵盖协议栈、套接字、TCP/IP协议、DNS查询、UDP、ICMP、ARP、网络包收发流程、滑动窗口、ACK号确认机制等核心概念。

说明见《网络是怎样连接的》阅读笔记(1),计算机网络基础知识小结笔记。


操作系统中的网络控制软件(协议栈)和网络硬件(网卡)

操作系统内部:包括协议栈

协议栈的上半部分:

有两块,分别是负责用TCP 协议收发数据的部分和负责用UDP 协议收发数据的部分,它们会接受应用程序的委托执行收发数据的操作。

浏览器、邮件等一般的应用程序都是使用TCP收发数据的.
DNS查询等收发较短的控制数据的时候则使用UDP
UDP协议中的套接字不绑定对方的地址和端口。

协议栈的下半部分:

用IP 协议控制网络包收发操作的部分。

在互联网上传送数据时,数据会被切分成一个一个的网络包,而将网络包发送给通信对象的操作就是由IP来负责的。

IP 中还包括ICMP协议和ARP协议。
ICMP用于告知网络包传送过程中产生的错误以及各种控制消息。
ARP用于根据IP地址查询相应的以太网MAC 地址。

IP 下面的网卡驱动程序负责控制网卡硬件,而最下面的网卡则负责完成实际的收发操作,也就是对网线中的信号执行发送和接收的操作。

套接字的作用:协议栈是根据套接字中记录的控制信息来工作的。

套接字中记录了用于控制通信操作的各种控制信息,协议栈则需要根据这些信息判断下一步的行动。
PID:Process ID(进程标识符)的缩写,是操作系统为了标识程序而分配的编号,使用任务管理器可以查询所对应的程序名称。

调用Socket库中的程序组件时,协议栈内部如何工作?

创建套接字时,首先分配一个套接字所需的内存空间(协议栈完成),然后向其中写入初始状态。
协议栈将表示指定套接字的描述符告知应用程序。而应用程序要向协议栈提供这个描述符。套接字的记录了通信双方的信息以及通信处于何种状态,所以只要通过描述符确定了套接字,协议栈就能够获取所有的相关信息。

连接

连接实际上是通信双方交换控制信息,在套接字中记录这些必要信息并准备数据收发的一连串操作

目的:

1、把服务器的IP 地址和端口号等信息告知协议栈
2、客户端向服务器传达开始通信的请求
3、分别“缓冲区”,用于在执行数据收发操作时临时存放要收发的数据的内存空间。

负责保存 控制信息 的头部
控制信息

第一类、客户端和服务器相互联络时交换的控制信息

这些信息不仅连接时需要,包括数据收发和断开连接操作在内,整个通信过程中都需要,这些内容在TCP 协议的规格中进行了定义。

第二类、保存在套接字中,用来 控制协议栈操作 的信息

TCP模块与服务器的TCP模块交换控制信息。

1、客户端先创建一个包含表示开始数据收发操作的控制信息的头部。连接操作的第一步是在TCP 模块处创建表示连接控制信息的头部。通过TCP 头部中的发送方和接收方端口号可以找到要连接的套接字。
2、TCP 头部创建好之后,接下来TCP 模块会将信息传递给IP 模块并委托它进行发送
3、IP模块执行网络包发送后,网络包就会通过网络到达服务器,然后服务器上的IP模块会将接收到的数据传给TCP模块。TCP模块根据TCP头部的信息找到端口号对应的套接字。
4、找到套接字后,套接字中会写入相应的信息,并将状态改为正在连接。
5、完成后服务器的TCP模块会返回相应。与客户端的过程一样。同时还需要将ACK控制位设为1,表示已经接收到相应的网络包。
6、服务器TCP模块会将TCP头部传递给IP模块,并委托IP模块向客户端返回响应。

客户端向服务器发送第一个网络包时,由于服务器还没有接收过网络包,所以需要将ACK 比特设为0。

刚才服务器返回响应时将ACK 比特设置为1,相应地,客户端也需要将ACK 比特设置为1 并发回服务器,告诉服务器刚才的响应包已经收到。当这个服务器收到这个返回包之后,连接操作才算全部完成。

收发数据,将HTTP请求消息交给协议栈

数据收发操作是从应用程序调用write 将要发送的数据交给协议栈开始的,协议栈收到数据后执行发送操作。

应用程序在调用write 时会指定发送数据的长度,在协议栈看来,要发送的数据就是一定长度的二进制字节序列而已。

协议栈收到数据后,会先将数据存放在内部的发送缓冲区中,并等待应用程序的下一段数据。

判断要素:什么时候才发出去?
1、每个网络能容纳的数据长度,协议栈根据MTU参数判断
MTU:一个网络包的最大长度,以太网中一般为1500 字节。MTU是包含头部的总长度,从MTU中减去头部的长度,得到的长度就是一个网络包中所能容纳的最大数据长度。这以长度叫做MSS。
MSS:除去头部之后,一个网络包所能容纳的TCP 数据的最大长度。

2、时间
当应用程序发送数据的频率不高的时候,如果每次都等到长度接近MSS 时再发送,可能会因为等待时间太长而造成发送延迟这种情况下,即便缓冲区中的数据长度没有达到MSS,也应该果断发送出去。为此,协议栈的内部有一个计时器,当经过一定时间之后,就会把网络包发送出去。
,在进行发送操作时需要综合考虑这两个要素以达到平衡。

使用ACK号确认网络包已收到。

TCP 具备确认对方是否成功收到网络包,以及当对方没收到时进行重发的功能,因此在发送网络包之后,接下来还需要进行确认操作。

返回ACK 号时,除了要设置ACK 号的值以外,还需要将控制位中的ACK 比特设为1,这代表ACK 号字段有效,接收方也就可以知道这个网络包是用来告知ACK 号的。

SYN 为1 表示进行连接,因为将SYN 设为1 并告知初始序号这一操作仅在连接过程中出现,因此发送SYN 为1 的网络包就表示发起连接的意思。

在将SYN 设为1 的同时,还需要同时设置序号字段的值,而这里的值就代表序号的初始值。

实际上,SYN 是Synchronize(同步)的缩写,意思是通过告知初始序号使通信双方保持步调一致,以便完成后续的数据收发检查,这才是SYN 原本的含义。

TCP 采用这样的方式确认对方是否收到了数据,在得到对方确认之前,发送过的包都会保存在发送缓冲区中。如果对方没有返回某些包对应的ACK 号,那么就重新发送这些包。TCP 会在尝试几次重传无效之后强制结束通信,并向应用程序报错。

网卡、集线器、路由器都没有错误补偿机制,一旦检测到错误就直接丢弃相应的包。
通过“序号”和“ACK 号”可以确认接收方是否收到了网络包。

根据网络包平均往返时间调整ACK 号等待时间

返回ACK 号的等待时间(这个等待时间叫超时时间)。

TCP 采用了动态调整等待时间的方法,这个等待时间是根据ACK 号返回所需的时间来判断的。

TCP 会在发送数据的过程中持续测量ACK 号的返回时间,如果ACK 号返回变慢,则相应延长等待时间;相对地,如果ACK 号马上就能返回,则相应缩短等待时间。

(由于计算机的时间测量精度较低,ACK 返回时间过短时无法被正确测量,因此等待时间有一个最小值,这个值在每个操作系统上不一样,基本上是在0.5 秒到1 秒之间。)

使用窗口有效管理ACK 号

每发送一个包就等待一个ACK 号的方式是最简单也最容易理解的,但在等待ACK 号的这段时间中,如果什么都不做那实在太浪费了。

TCP采用图滑动窗口方式来管理数据发送和ACK 号的操作
即在发送一个包之后,不等待ACK 号返回,而是直接发送后续的一系列包,以有效利用等待ACK号这段时间。
但是,可能会出现发送包的频率超过接收方处理能力的情况。

具体操作:

当接收方的TCP 收到包后,会先将数据存放到接收缓冲区中。然后,接收方需要计算ACK 号,将数据块组装起来还原成原本的数据并传递给应用程序,如果这些操作还没完成下一个包就到了也不用担心,因为下一个包也会被暂存在接收缓冲区中。如果数据到达的速率比处理这些数据并传递给应用程序的速率还要快,那么接收缓冲区中的数据就会越堆越多,最后就会溢出。

如何避免?
1、接收方需要告诉发送方自己最多能接收多少数据,然后发送方根据这个值对数据发送操作进行控制,这就是滑动窗口方式的基本思路。

能够接收的最大数据量称为窗口大小,它是TCP 调优参数中非常有名的一个。

更新窗口大小的时机应该是接收方从缓冲区中取出数据传递给应用程序的时候。当接收方将数据传递给应用程序,导致接收缓冲区剩余容量增加时,就需要告知发送方,这就是更新窗口大小的时机。

IP模块将数据封装成包发送给通信对象。

1、发送方的网络设备负责创建包————生成含有正确控制信息的头部,然后再附加上要发送的数据


2、包被发往最近的网络转发设备,转发设备根据头部信息判断接下来发往哪里


3、再次被转发到下一个转发设备,经过多个转发设备的接力,最终到达目的地。


(1)路由器根据目标地址判断下一个路由器的位置
(2)集线器在子网中将网络包传输到下一个路由


实际上,集线器是按照以太网规则传输包的设备而路由器是按照IP规则传输包的设备,因此我们也可以作如下理解。


(1)IP 协议根据目标地址判断下一个IP 转发设备的位置(判断位置
(2)子网中的以太网协议将包传输到下一个转发设备(进行传输


TCP/IP 包包含如下两个头部。
(a)MAC 头部(用于以太网协议)
(b)IP 头部(用于IP 协议)


TCP/IP包的传送过程

A 刚开始,还在客户端,准备发往第一个集线器:

1、首先,发送方将包的目的地,也就是要访问的服务器的IP 地址写入IP 头部中

2、IP 协议就可以根据这一地址查找包的传输方向,从而找到下一个路由器的位置

3、IP协议会委托以太网协议将包传输过去,并且IP协议会查找下一个路由器的以太网地址(MAC地址),并将这个地址写入MAC头部中,即改写了MAC头部。

每到一个节点,收到包的时候MAC头部会被舍弃,当再次发送出去的时候又会加上包含新MAC地址的新MAC头部

4、这样一来,以太网协议据知道要将这个包发到哪一个路由器上了。


B 已经由客户端传送到第一个集线器上时:

为了判断包接下来应该向什么地方传输,集线器中有一张表(用于以太网协议的表),可根据以太网头部中记录的目的地信息(MAC地址)查出相应的传输方向。


C 由第一个集线器发往下一个地方,即第一个路由器:

接着,包到达下一个路由器。路由器中有一张IP协议的表,可根据该表及IP头部中记录的目的地信息查出接下来应该发往哪个路由器

同时,为了将包发到下一个路由器,还需要查出下一个路由器的MAC地址,并更新到MAC头部中。

由此,包又被发往下一个节点。


以太网协议MAC头部的信息关注的是下一个路由器的地址,即便到达下一个路由器之前可能还要集线器,MAC头部也只关注路由器地址。

而IP协议知道要前往下一个路由器应该怎么走,虽然IP头部中存放的时最终目的地的地址,但正因如此,IP协议就知道如何选择下一步的路线。即如何为了到达最终目的,且下一个到达的路由器指定的情况下需要走哪个集线器


上面阐述的是IP和以太网的分工,其中以太网的部分可以替换成其他东西,如:
无线局域网
ADSL
FTTH等。
他们都可以替代以太网的角色帮助IP协议来传输网络包。当然,当以太网被替换后,MAC头部也会被替换为适合所选通信规格的其他头部。

那为什么要这么分工呢?
将IP和负责传输的网络分开,可以更好的根据需要使用各种通信技术。互联网网络庞大而复杂,在架构上需要保证灵活性


在协议栈中IP模块是如何完成包收发操作的?

虽说IP模块负责将包发给对方,但实际上将包从发送方传输到接收方的工作的由集线器、路由器等网络设备完成。
所以IP模块只是整个包传输过程的入口

1、包收发操作的起点:TCP模块委托IP模块发送包的操作。
即TCP模块在数据块的前面加上TCP头部,然后整个传递给IP模块,这整个"东西"就是网络包的内容。
2、 与其同时,TCP模块还需要指定通信对象的IP地址
即需要写清楚“将什么内容发给谁”。
3、收到委托后,IP模块会将包的内容当作一整块数据,在前面 加上包含控制信息的头部
IP模块会添加IP头部和MAC头部这两种头部。
IP头部中包含IP协议规定的、根据IP地址将包发往目的地所需的控制信息。
MAC头部包含通过以太网的局域网将包传输至最近的路由器陆续的控制信息

加上两个头部以后,一个包就封装好了。

这些就是IP模块负责的工作:

IP 模块负责添加如下两个头部。
(1) MAC 头部:以太网用的头部,包含MAC 地址
(2) IP 头部:IP 用的头部,包含IP 地址


接着,封装好的包会交给网络硬件,统称为 网卡(网络接口)。
传递给网卡的网络包是一连串二进制信息,网卡会将这些信息转换为电信号或光信号发送出去,然后这些信号就会达到集线器、路由器等转发设备,再一步步送达接收方。

包送达后,接收方也会做出相应,返回的包的传送过程是逆向的
信息先以电信号的形式从网线传输进来,然后由网卡将其转换为数字信息并传递给IP 模块。接下来,IP 模块会将MAC 头部和IP 头部后面的内容,也就是TCP 头部加上数据块,传递给TCP 模块。接下来的操作就是我们之前讲过的TCP 模块负责的部分了。

关键点

TCP 模块在收发数据时会分为好几个阶段,并为各个阶段设计了实现相应功能的网络包,但IP 的包收发操作都是相同的,并不会因包本身而有所区别。

因为IP 模块会将TCP 头部和数据块看作一整块二进制数据,在执行收发操作时并不关心其中的内容,也不关心这个包是包含TCP 头部和数据两者都有呢,还是只有TCP头部而没有数据。

IP 模块也不关心TCP 的操作阶段,对于包的乱序和丢失也一概不知。

总之,IP 的职责就是将委托的东西打包送到对方手里,或者是将对方送来的包接收下来,仅此而已。

无论要收发的包是控制包还是数据包,IP 对各种类型的包的收发操作都是相同的。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值