网络是怎样连接的_学习笔记(第2章)
2.0 前言
- 这一章的思维导图因为出差前前后后写了有20多天,本文主要就是按照自己对网络的理解进行表述,希望看到本文的小伙伴可以较为清晰的理解其中内容,希望可以帮助到读者,这是我莫大的荣幸。
- 文字部分主要是讲一个框架和思路,具体细节在思维导图中呈现。
2.1 创建套接字及其细节
-
待发送的数据从应用程序被提交给协议栈,协议栈分为上下两层,上边是TCP/UDP模块,下面是IP模块。对于一般的TCP/IP协议通讯,自然这些数据会先交给TCP模块来处理,之后TCP处理后再把数据交给IP模块(这个下文会细讲) -
所谓创建套接字,在代码实现上非常简单如下所示 // Win下创建Socket的API
SOCKET WSAAPI socket(
int af,
int type,
int protocol
);
-
socket套接字的本质一堆网络通信相关的控制信息,比如IP地址、端口号、当前通信状态等等 -
创建套接字的本质就是分配一块可以用于存储这些控制信息的内存,之后写入初始状态信息
2.2 连接服务器及其细节
- 连接服务器,也就是所谓的建立连接的过程,我们知道TCP\IP通信的特点是基于连接的、可靠的。这一步就是连接那一步啦
- 连接连接的目的主要是交换客户端与服务端之间的控制信息,因为这是通信的基础。
- 客户端将自己的IP地址、端口号等告知服务端,服务端将这些信息告知自己的协议栈 (第1次握手)
- 服务端将返回自己的IP地址、端口号等信息,客户端接收到后将服务端或对端的这些信息告知自己的协议栈 (第2次握手)
- 客户端再给服务端回复一个消息表示自己受到了服务端的数据 (第3次握手)
- 如果一切顺利,双方都将分配用于存储临时数据的缓冲区
- 至此,连接成功,然后就可以快乐的收发数据了
2.3 收发数据及其细节
- 还是浏览器等应用软件将数据交给协议栈,在协议栈看来,这些数据都是没有任何分别的二进制字节序列。
- 协议栈会根据数据长度和延迟时间的要求决定数据的发送时机
- 数据长度是一个网络包最多可以发送的数据量-----网络包变大可以提高网络传输效率,但会使延迟时间增加
- 延迟时间是数据提交给协议栈到协议栈发送这些数据之间的时间差—协议栈接收到数据后立刻发送会导致网络包的传输效率降低,也会使延迟时间降低
- 从应用程序拿到原始的数据,如果太大,超过了MSS(一个网络包最多可携带的数据量),将会进行分包。然后再将这些数据进行打包,打包过程如下所示:
- TCP对原始数据打包---->加上TCP头部
- IP模块对上述包再打包---->加上IP头部
- IP模块继续对上述包打包---->加上MAC头部
- TCP/IP协议传输是非常可靠的,那他是靠什么来实现这种可靠呢?
- ACK号确认就是最重要的因素,也就是确认响应
- 如果一个网络包就把数据发送完毕,那就不需要分包之类的操作了,对端接受到数据后,需要返回一个确认响应
- 如果需要分包,那么每次发送的网络包中就要重点关注其中的序号字段了,这个序号代表了本网络包在拆分前数据包中次序(位置),这些包被发送到对端后,会根据其中的序号进行重组,重组成原始数据的样子
- 基于以上的基本原理,客户端—服务端在数据收发时的动作大致如下
- 客户端连接服务器,将自己的数据起始序号告诉服务器,尝试建立连接(这起始时第一次握手过程中发生的)
- 服务端收到后,根据收到的序号计算ACK值、自己这边的数据起始序号一并发给客户端(第二次握手中发生)
- 客户端收到后,再计算ACK号,返回给服务器(第三次握手-----建立连接成功)
- 从这一步开始就是数据的收发阶段,TCP/IP是全双工的工作方式,也即两端都可以同时收发数据
- 发送方发送包含数据和更新的序号的网络包
- 接收方接到数据后,返回ACK号进行响应确认
-
上面讲到说,接收方在接收到数据之后会进行ACK号返回,也就是确认响应。发送方只有接收到确认响应之后才会认为自己的数据已经正确接收了,否则就会进行重发! -
那么问题来了,就好比约会等人一样,等多久就被认为对方不会来了呢?在这里也即是等ACK多久呢?(多久算是超时时间呢?) -
我们可以稍微分析一下: ? ①如果当前网络状况不太好,有点拥挤势必会造成ACK返回时间变长,但是只要给衣袋里时间,ACK(确认响应)就会到达,因此超时时间不能太短。 ? ②如果网络很差很差,甚至网线都断了,总之,就是数据不能被返回了,那么发送端等再久,ACK确认响应也不会到大,所以超时时间也不能无限长。 -
实际的处理方式是动态的调整超时时间
- 当ACK返回非常快时,就缩短超时时间
- 当ACK返回变慢时,就适当的延长超时时间
==经常被问到的滑动窗口技术
- 滑动窗口技术是一种用于提高TCP\IP网络通信效率的机制
- 设想一下,如果每次发送端发送完数据后都要等待ACK返回确认之后再发送下一个包,那么等待的这段时间不久被极大的浪费了吗?《教员曾说过:“浪费和腐败是极大的犯罪!”》于是,滑动窗口应运而生。
- 具体来讲也比较简单:就是不等待ACK返回,就直接发送下一个数据包
- 但是接收方可能接收数据的能力有限,如果发送方不知疲倦的一直发送,必然导致数据传输出错,因此接收方在正是收发数据之前,需要将自己能接收到数据量告诉对端,这个数据量也即是窗口大小
- 其实在建立连接的时候,两端就会将自己的窗口大小告诉对端。然后后续的数据收发过程中,会及时的更新窗口大小,因为窗口大小字段也是TCP头部中的一个字段
2.4 断开并删除套接字及其细节
-
断开连接的过程就是那个非常著名的**“四次挥手”**了,其实理解了三次握手后,四次挥手就好理解了 -
如上思维导图所示:(四次挥手) ? ①服务器向客户端发送断开请求(FIN = 1)也可以是由客户端发起,这因应用软件而异 ? ②客户端收到后,向服务端回复确认响应(ACK = 1) ? ③客户端向服务器发送断开请求(FIN = 1) ? ④服务器收到后,向客户端回复确认响应(ACK = 1)
2.5 IP与以太网的包收发操作(TCP)
2.5.1网络包的结构
2.5.3协议栈中的TCP和IP模块
协议栈的结构示意图
TCP模块主要是打包TCP头部(包括了通讯所要用到控制信息、端口号以及给IP模块指定对端的IP地址等)
IP模块主要是打包IP头部(包含了自己的IP地址、对端的IP地址等)打包MAC头部(发送方和接收方的MAC地址)
2.5.3以太网的基本知识
- MAC地址就是服务与以太网协议通信的,数据只会流到MAC地址指定的设备,不会跑到其他地方
2.5.4网卡的基本知识
-
网卡的结构如上图所示: 发送数据和接收数据逻辑相反,就以发送为例进行阐述
- 在网卡驱动对网卡进行初始化之后,网卡就可以正常工作了
- 首先MAC模块从网卡缓冲区中读取要发送的已经打包好的数据包
- 在数据包的前面(加上报头,起始帧分界符)后面(加上帧校验序列)形成一个**“最终版的网络包”**
- MAC模块将这个包(数字信息)转化为通用格式的信号(我的理解就是可以让PHY模块根据网线或协议的同,转化为任意需要的其他格式的通用格式)
- MAC模块将通用格式的数据交给PHY模块
- PHY模块将通用格式的数据转化为在网线(光纤、电话线)上传输的信号格式
- 通过RJ-45接口将数据传输出去
2.5.5 UDP协议收发数据
2.6 名词解释
- TCP协议
- Transmission Control Protocol:传输控制协议
- 一种可靠的、面向连接的、基于字节流的传输层通信协议
- 如上文所述,是要和IP协议配合使用
- 上文中的TCP头部便是其协议中的各种字段内容,对应其工作方式
- UDP
- User Datagram Protocol:用户数据报协议
- 一种无连接的、不太可靠(会丢包)、快速传输的传输层通信协议
- 和IP协议配合使用
- IP协议与IP地址
- Internet Protocol:网络互连协议
- IP协议提供了一种端到端的连接,通过IP地址。
- IP地址是IP协议中一个重要的“成员”
- ICMP协议
- Internet Control Message Protocol:网络控制报文协议
- 主要功能是:在主机和路由器之间传输例如“网络出错”、“路由时候故障”等信息
- ARP协议
- Address Resolution Protocol:地址解析协议
- 主要功能是:通过IP查询目标的物理地址(具体工作方式将上文导图)
- MAC地址
- Media Access Control Address:媒体存取地址又称为MAC位址、以太网地址、物理地址
- 每一个网卡都有一个全球唯一的MAC地址,用于标识其身份
- 主要用于以太网中确定某子网中的一台设备
- MTU
- Maximum Transmission Unit:最大传输单元
- 指的是一个网络包的最大长度(包含头部数据)
- MSS
- MTU
- Maximum Transmission Unit:最大传输单元
- 指的是一个网络包的最大长度(包含头部数据)
- MSS
- Maximum Segment Size:最大报文段长度
- 特属于TCP协议中的一个名词
- 指的是TCP包中,去掉TCP头部后,所能承载的最大的数据量(数据长度)
2.7 最后上两张做的导图一览(等我全本书都做好了就免费上传分享出来)
|