一 网络传输基本流程

网络通信基本原理(一) - 图1

  • 客户端产生数据,存放于客户端应用的内存中,然后调用接口将自己内存中的数据发送/拷贝给操作系统内存。
  • 客户端操作系统收到数据后,按照客户端应用指定的规则(即协议),调用网卡并发送数据。
  • 网络传输数据。
  • 服务端应用调用系统接口,想要将数据从操作系统内存拷贝到自己的内存中。
  • 服务端操作系统收到指令后,使用与客户端相同的规则(即协议)从网卡读取数据,然后拷贝给服务端应用。

二 TCP五层模型详解

2.1 基本知识

计算机与计算机之间要有统一的连接标准才能够完成相互通信,这个标准被称为互联网协议,而网络就是物理链接介质+互联网协议,人们将互联网协议从不同维度分为OSI七层、TCP/IP五层或TCP/IP四层
网络通信基本原理(一) - 图2

网络通信基本原理(一) - 图3

2.2 物理层

物理层主要是基于电器特性发送高低电平信号,电平即“电压平台”,指的是电路中某一点电压的高低状态,在网络信号中高电平用数字1表示,低电平用数字0表示。

2.3 数据链路层

由于单纯的电平信号0和1没有任何意义,在实际应用中,我们会将电平信号进行分组处理,多少位一组、每组什么意思,这样数据才有具体的含义。数据链路层的功能就是定义电平信号的分组方式。

2.3.1 以太网协议

数据链路层使用以太网协议进行数据传输,基于MAC地址的广播方式实现数据传输,只能在局域网内广播。早期各个公司都有自己的分组方式,后来形成了统一的标准,即以太网协议Ethernet。

2.3.2 Ethernet以太网

  • 由一组电平信号构成一个数据包,叫作帧,每一数据帧由报头Head和数Data两部分组成
  • Head:固定18字节,其中发送者/源地址6字节,接收者/目标地址6字节,数据类型6字节
  • Data:最短46字节,最长1500字节
  • 数据包的具体内容格式为:Head长度+Data长度=最短64字节,最长1518字节(超过最大限制就分片发送)

2.3.3 MAC地址

  • Head中包含的源地址和目标地址的由来:Ethernet规定接入Internet的设备必须配有网卡,发送端和接收端的地址便是指网卡的地址,即MAC地址。
  • MAC地址:每块网卡出厂时都被印上一个世界唯一的MAC地址,它是一个长度为48位的二进制数,通常用12位十六进制数表示(前6位是厂商编号,后6位是流水线号): 00-50-56-C0-00-08

2.3.4 Broadcast广播

有了MAC地址,同一网络内的两台主机就可以通信了(一台主机通过ARP协议获取另外一台主机的MAC地址)

网络通信基本原理(一) - 图4

2.4 网络层

MAC地址是无法区分的,它只跟厂商有关,网络层就是用来解决这一问题的。网络层的作用就是引入一套新的地址来区分不同的广播域/子网,这套地址叫作网络地址。

2.4.1 IP

  • 规定网络地址的协议叫作IP(Internet Protocol,网际互联协议),它定义的地址称为IP地址。广泛采用v4版本即IPv4,规定网络地址由32位二进制数表示。一个IP地址通常写成四段十进制数,例如172.16.10.1,其取值范围为:0.0.0.0~255.255.255.255
  • P地址由两部分组成:网络部分(用来标识子网)和主机部分(用来标识主机)

2.4.2 子网掩码

  • 所谓子网掩码,就是表示子网络特征的一个参数。它在形式上等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。
  • 我们根据子网掩码就能判断任意两个IP地址是否处于同一个子网络。方法是将两个IP地址与子网掩码分别进行&运算(两个数位都为1,运算结果为1,否则为0),然后比较结果是否相同,如果相同,就表明它们在同一个子网络中,否则就不在。

网络通信基本原理(一) - 图5

2.4.3 IP数据包

  • IP数据包也分为Head和Data两部分,无须为IP数据包定义单独的栏位,直接放入以太网包的Data部分即可
  • Head(IP头部):长度为20~60字节。Data(IP数据):最长为65515字节。而以太网数据包的Data部分,最长只有1500字节。因此,如果IP数据包超过1500字节,它就需要分割成几个以太网数据包,分开发送

2.4.4 ARP

网络通信基本原理(一) - 图6

ARP用于实现从IP地址到MAC地址的映射,即询问目标IP地址对应的MAC地址,以广播的方式发送数据包,获取目标主机的MAC地址。

基本步骤

  • 通过IP地址和子网掩码计算出自己所处的子网

网络通信基本原理(一) - 图7

  • 分析主机AB是否处于同一网络,如果不是同一网络,那么下表中目标IP地址为10.1.20.109(访问路由器的路由表),通过ARP获取的是网关的MAC地址

网络通信基本原理(一) - 图8

  • 根据主机A上的路由表内容,确定用于访问主机B的转发IP地址是10.1.20.109。然后主机A在自己的本地ARP缓存中检查主机B的匹配MAC地址
  • 如果主机A在ARP缓存中没有找到映射,它将询问10.1.20.64的硬件地址,从而将ARP请求帧广播到本地网络上的所有主机。源主机A的IP地址MAC地址都包括在ARP请求中。本地网络上的每台主机都接收到ARP请求并且检查是否与自己的IP地址匹配。如果主机发现请求的IP地址与自己的IP地址不匹配,它将丢弃ARP请求
  • 主机B确定ARP请求中的IP地址与自己的IP地址匹配,将主机A的IP地址和MAC地址映射添加到本地ARP缓存中
  • 主机B将包含其MAC地址的ARP回复消息直接发送回主机A
  • 当主机A接收到从主机B发来的ARP回复消息时,会用主机B的IP地址和MAC地址映射更新ARP缓存。本机缓存是有生存期的,生存期结束后,将再次重复上面的过程。主机B的MAC地址一旦确定,主机A就能向主机B发送IP地址了

白话版

  • 我是主机A,IP地址为10.1.20.64,MAC地址为00:08:ca:xx:xx:xx,请问主机B,IP地址为10.1.20.109,你的MAC地址是多少?
  • 我是主机B,IP地址为10.1.20.109,MAC地址为44:6d:57:xx:xx:xx。你好,主机A,IP地址为10.1.20.64,MAC地址为00:08:ca:xx:xx:xx
  • 主机A向主机B发送IP地址

2.5 传输层

端口就是应用程序与网卡关联的编号。那么传输层就是用来建立端口到端口的通信机制的

  • 主机端口的取值范围为0~65535,其中0~1023为系统保留端口的取值范围,也叫作BSD保留端口。
  • 用户可注册端口的取值范围为1024~49152,还有随机动态端口的取值范围为49152~65535。

2.5.1 TCP协议

TCP(Transmission Control Protocol,传输控制协议)是一种可靠传输协议,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割,其数据结构如下图所示。

网络通信基本原理(一) - 图9

2.5.2 UDP协议

UDP(User Datagram Protocol,用户数据报协议)是一种不可靠传输协议,“报头”部分总共有8字节,总长度不超过65535字节,正好放进一个IP数据包,其数据结构如下图所示。

网络通信基本原理(一) - 图10

2.5.3 TCP报文结构

网络通信基本原理(一) - 图11

  • TCP报文是TCP层传输的数据单元,也叫作报文段。
  • 端口号:用来标识同一台计算机的不同应用进程。
    • 源端口:源端口和IP地址的作用是标识报文的返回地址。
    • 目的端口:目的端口指明接收方计算机上的应用程序接口。
  • 序号:TCP可靠传输的关键部分。序号是本报文段发送的数据组的第一个字节的序号。在TCP传送的流中,每一个字节都有一个序号。例如:一个报文段的序号为300,此报文段数据部分共有100字节,则下一个报文段的序号为400。所以序号确保了TCP传输的有序性。
  • 确认号:确认号,即ACK,指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误地收到。确认号只有当ACK标志为1时才有效。比如建立连接时,SYN报文的ACK标志为0。
  • 数据偏移:头部长度也叫数据偏移,是因为头部长度实际上指示了数据区在报文段中的起始偏移值。
  • 保留:为将来定义新的用途保留,现在一般设置为0
  • 标志位:URG、ACK、PSH、RST、SYN、FIN,共6个,每一个标志位都表示一个控制功能

网络通信基本原理(一) - 图12

  • 窗口:滑动窗口大小,用来告知发送端接收端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小是一个16位属性,因而窗口大小最大为65535
  • 校验和:奇偶校验,此校验和针对整个TCP报文段,包括TCP头部和TCP数据,以16位属性进行计算所得。由发送端计算和存储,并由接收端进行验证
  • 紧急指针:只有当URG标志为1时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号属性中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式
  • 选项和填充:最常见的可选属性是最长报文大小,又称为MSS(MaximumSegment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接收的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个属性中加入额外的零,以保证TCP头部长度是32位的整数倍。
  • 数据部分:TCP报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有TCP头部。如果一方没有数据要发送,也使用没有任何数据的头部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。

2.5.4 三次握手

  • 第一次握手:建立连接时,客户端发送SYN包(syn=1)到服务器,并进入SYN_SENT状态,等待服务器确认。
  • 第二次握手:服务器收到SYN包,必须确认客户端的SYN包(ack=x+1),同时自己也发送一个SYN包(syn=1),即SYN+ACK包,此时服务器进入SYN_RECV状态。
  • 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
  • 至此,TCP连接就建立了,客户端和服务器可以愉快地“玩耍”了。只要通信双方没有一方发出连接释放的请求,连接就将一直保持。如果有一方释放连接,就会发起挥手操作。

2.5.5 四次挥手

  • 第一次挥手:客户端进程发出连接释放报文,并且停止发送数据。释放数据报文头部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN_WAIT_1(终止等待1)状态。TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
  • 第二次挥手:服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务器就进入了CLOSE_WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器方向的连接就被释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接收。这个状态还要持续一段时间,也就是整个CLOSE_WAIT状态持续的时间。
  • 第三次挥手:服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST_ACK(最后确认)状态,等待客户端的确认。
  • 第四次挥手:客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME_WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2×MSL(最长报文段寿命)的时间,当客户端撤销相应的TCB(Transmit Control Block,传输控制模块)后,才进入CLOSED状态。

网络通信基本原理(一) - 图13

2.6 应用层

网络通信基本原理(一) - 图14

2.6.1 DNS协议

DNS是英文Domain Name System(域名系统)的缩写,用来把便于人们使用的机器名字转换为IP地址。

2.6.2 HTTP协议

HTTP(HyperText Transfer Protocol,超文本传输协议)是面向事务的应用层协议。它是互联网上能够可靠地交换信息的重要基础。

2.6.3 FTP协议

FTP(File Transfer Protocol,文件传输协议)是互联网上使用最广泛的文件传送协议。

2.6.4 SMTP协议

SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)规定了在两个相互通信的SMTP进程之间应如何交换信息。SMTP通信的三个阶段:建立连接、邮件传送和连接释放。

2.6.5 POP3协议

POP3(Post Office Protocol 3,邮件读取协议)通常被用来接收电子邮件。

2.6.6 Telnet协议

Telnet协议是一个简单的远程终端协议,也是互联网的正式标准,又称为终端仿真协议。

网络通信基本原理(一) - 图15