imx6ull/linux应用编程学习(10)网络基础知识(基于正点原子)

网络通信概述
 

         网络通信本质上是一种进程间通信,是位于网络中不同主机上的进程之间的通信,属于 IPC 的一种,通常称为 socket IPC。

        大概可以分为三个层次,如下所示:

(1)、硬件层:网卡设备,收发网络数据

(2)、驱动层:网卡驱动(Linux 内核网卡驱动代码)

(3)、应用层:上层应用程序(调用 socket 接口或更高级别接口实现网络相关应用程序)

        在硬件上,两台主机都提供了网卡设备,也就满足了进行网络通信最基本的要求,网卡设备是实现网络数据收发的硬件基础。并且通信的两台主机之间需要建立网络连接,这样两台主机之间才可以进行数据传输,譬如通过网线进行数据传输。网络数据的传输媒介有很多种,大体上分为有线传输(譬如双绞线网线、光纤等)和无线传输(譬如 WIFI、蓝牙、 ZigBee、 4G/5G/GPRS 等), PC 机通常使用有线网络,而手机等移动设备通常使用无线网络。

        在内核层,提供了网卡驱动程序,可以驱动底层网卡硬件设备,同时向应用层提供 socket 接口。
        在应用层,应用程序基于内核提供的 socket 接口进行应用编程,实现自己的网络应用程序。需要注意的是, socket 接口是内核向应用层提供的一套网络编程接口,

1.网络互连模型: OSI 七层模型
 

        七层模型,亦称 OSI,OSI 七层模型是一个网络互连模型,从上到下依次是:

应用层


        应用层(Application Layer)是 OSI 参考模型中的最高层,是最靠近用户的一层,为上层用户提供应用接口,也为用户直接提供各种网络服务。我们常见应用层的网络服务协议有: HTTP、 FTP、 TFTP、 SMTP、SNMP、 DNS、 TELNET、 HTTPS、 POP3、 DHCP。

表示层

        表示层(Presentation Layer)提供各种用于应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另一个系统的应用层识别。如果必要,该层可提供一种标准表示形式,用于将计算机内部的多种数据格式转换成通信中采用的标准表示形式。数据压缩/解压缩和加密/解密(提供网络的安全性)也是表示层可提供的功能之一

会话层

        会话层(Session Layer)对应主机进程指本地主机与远程主机正在进行的会话。会话层就是负责建立、管理和终止表示层实体之间的通信会话。该层的通信由不同设备中的应用程序之间的服务请求和响应组成。将不同实体之间表示层的连接称为会话。因此会话层的任务就是组织和协调两个会话进程之间的通信,并对数据交换进行管理。
        

传输层


        传输层(Transport Layer)定义传输数据的协议端口号以及端到端的流控和差错校验。该层建立了主机端到端的连接,传输层的作用是为上层协议提供端到端的可靠和透明的数据传输服务,包括差错校验处理和流控等问题。我们通常说的, TCP、 UDP 协议就工作在这一层,端口号既是这里的“端”

网络层
 

        进行逻辑地址寻址,实现不同网络之间的路径选择。本层通过 IP 寻址来建立两个节点之间的连接,为源端发送的数据包选择合适的路由和交换节点,正确无误地按照地址传送给目的端的运输层。网络层(Network Layer)也就是通常说的 IP 层。该层包含的协议有: IP(Ipv4、 Ipv6)、 ICMP、 IGMP 等。

数据链路层

        数据链路层(Data Link Layer)是 OSI 参考模型中的第二层,负责建立和管理节点间逻辑连接、进行硬件地址寻址、差错检测等功能。将比特组合成字节进而组合成帧,用 MAC 地址访问介质,错误发现但不能纠正。数据链路层又分为 2 个子层:逻辑链路控制子层(LLC)和媒体访问控制子层(MAC)。 MAC 子层的主要任务是解决共享型网络中多用户对信道竞争的问题,完成网络介质的访问控制; LLC 子层的主要任务是建立和维护网络连接,执行差错校验、流量控制和链路控制。

        数据链路层的具体工作是接收来自物理层的位流形式的数据,并封装成帧,传送到上一层;同样,也将来自上层的数据帧,拆装为位流形式的数据转发到物理层;并且,还负责处理接收端发回的确认帧的信息,以便提供可靠的数据传输。

物理层

        物理层(Physical Layer)是 OSI 参考模型的最低层,物理层的主要功能是:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输,物理层的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。使数据链路层不必考虑网络的具体传输介质是什么。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说,这个电路好像是看不见的。

        实际上,网络数据信号的传输是通过物理层实现的,通过物理介质传输比特流。物理层规定了物理设备标准、电平、传输速率等。常用设备有(各种物理设备)集线器、中继器、调制解调器、网线、双绞线、同轴电缆等,这些都是物理层的传输介质

2.TCP/IP 四层/五层模型

        事实上, TCP/IP 模型是 OSI 模型的简化版本,我们来看看 OSI 七层模型和 TCP/IP 五层模型之间的对应的关系

        所以由上图可知, TCP/IP 五层模型中,将 OSI 七层模型的最上三层(应用层、表示层和会话层)合并为一个层,即应用层,所以 TCP/IP 五层模型包括:应用层、传输层、网络层、数据链路层以及物理层。除了 TCP/IP 五层模型外,还有 TCP/IP 四层模型,与五层模型唯一不同的就是将数据链路层和物理层合并为网络接口层,如下图所示

        由上图可知,四层模型包括:应用层、传输层、网络层以及网络接口层。而在实际的应用中还是使用TCP/IP 四层模型,五层模型是专门为介绍网络原理而设计的

3.数据的封装与拆封
 

        网络通信中,数据从上层到下层交付时,要进行封装;同理,当目标主机接收到数据时,数据由下层传递给上层时需要进行拆封。这就是数据的封装与拆封
        

        当用户发送数据时,将数据向下交给传输层,但是在交给传输层之前,应用层相关协议会对用户数据进行封装譬如 MQTT、 HTTP 等协议,其实就是在用户数据前添加一个应用程序头部,这是处于应用层的操作,最后应用层通过调用传输层接口来将封装好的数据交给传输层。

        传输层会在数据前面加上传输层首部(此处以 TCP 协议为例,图中的传输层首部为 TCP 首部,也可以是 UDP 首部),然后向下交给网络层

        同样地,网络层会在数据前面加上网络层首部(IP 首部),然后将数据向下交给链路层,链路层会对数据进行最后一次封装,即在数据前面加上链路层首部(此处使用以太网接口为例,对应以太网首部),然后将数据交给网卡。

         最后,由网卡硬件设备将数据转换成物理链路上的电平信号,数据就这样被发送到了网络中。这就是网络数据的发送过程,从图中可以看到,各层协议均会对数据进行相应的封装,可以概括为 TCP/IP 模型中的各层协议对数据进行封装的过程

        以上便是网络数据的封装过程,当数据被目标主机接收到之后,会进行相反的拆封过程,将每一层的首部进行拆解最终得到用户数据。所以,数据的接收过程与发送过程正好相反,可以概括为 TCP/IP 模型中的各层协议对数据进行解析的过程

4.IP 地址

        Internet 依靠 TCP/IP 协议,在全球范围内实现不同硬件结构、不同操作系统、不同网络系统的主机之间的互联在 Internet 上,每一个节点都依靠唯一的 IP 地址相互区分和相互联系, IP 地址用于标识互联网中的每台主机的身份,设计人员为每个接入网络中的主机都分配一个 IP 地址(Internet Protocol Address),只有合法的 IP 地址才能接入互联网中并且与其他主机进行网络通信, IP 地址是软件地址,不是硬件地址,硬件 MAC 地址是存储在网卡中的,应用于局域网中寻找目标主机。

IP 地址的编址方式

        传统的 IP 地址是一个 32 位二进制数的地址,也叫 IPv4 地址由 4 个 8 位字段组成。除了 IPv4 之外,还有 IPv6, IPv6 采用 128 位地址长度, 8 个 16 位字段组成,本小节我们暂时不去理会 IPv6 地址。

        在网络通信数据包中, IP 地址以 32 位二进制的形式表示;而在人机交互中,通常使用点分十进制方式表示,譬如 192.168.1.1,这就是点分十进制的表示方式

        IP 地址中的 32 位实际上包含 2 部分,分别为网络地址和主机地址,可通过子网掩码来确定网络地址和主机地址分别占用多少位

IP 地址的分类


        根据 IP 地址中网络地址和主机地址两部分分别占多少位的不同,将 IP 地址划分为 5 类,分别为 A、B、 C、 D、 E 五类,如下所示:

1、 A 类 IP 地址


    从上图中可以看到,一个 A 类 IP 地址由 1 个字节网络地址和 3 个字节主机地址组成而网络地址的最高位必须为 0,因此可知,网络地址取值范围为 0~127,一共 128 个网络地址。当然,这 128 个网络地址中,其中 3 个网络地址用作特殊用途,因此可用的网络地址有 125 个。

(1)、 A 类地址的第一字节为网络地址,其它 3 个字节为主机地址;

(2)、 A 类地址范围为: 1.0.0.1 ~ 127.255.255.254;

(3)、 A 类地址中设有私有地址和保留地址:

①、 10.X.X.X 是私有地址,所谓私有地址就是在互联网中不能使用,而被用在局域网中使用的地址。

②、 127.X.X.X 是保留地址,用作循环测试使用。

2、 B 类 IP 地址
 

                一个 B 类 IP 地址由 2 个字节的网络地址和 2 个字节的主机地址组成网络地址的最高位必须是“10”,因此,网络地址第一个字节的取值范围为 128~191, IP 地址范围从 128.0.0.0 到 191.255.255.255。对于 B 类地址来说,一共拥有 16384 个网络地址,其中可用的网络地址有 16382 个,每个网络地址能容纳约 6 万(2^16- 2=65534)多个主机。

(1)、 B 类地址中第 1 字节和第 2 字节为网络地址,其它 2 个字节为主机地址。

(2)、 B 类地址范围: 128.0.0.1 ~ 191.255.255.254。

(3)、 B 类地址中设有私有地址和保留地址:

①、 172.16.0.0 ~ 172.31.255.255 是私有地址

②、 169.254.X.X 是保留地址。如果你的 IP 地址是自动获取 IP 地址,而你在网络上又没有找到可用的DHCP 服务器。就会得到其中一个 IP

3、 C 类 IP 地址
 

        一个 C 类 IP 地址由 3 字节的网络地址和 1 字节的主机地址组成网络地址的最高位必须是“110”,因此 C 类 IP 地址的第一个字节的取值范围为 192~223范围从 192.0.0.0 到 223.255.255.255,网络地址可达209 万余个,每个网络地址能容纳 254 个主机。

(1)、 C 类地址第 1 字节、第 2 字节和第 3 个字节为网络地址,第 4 个个字节为主机地址。另外第 1 个字节的高三位固定为 110。

(2)、 C 类地址范围为: 192.0.0.1 ~ 223.255.255.254。

(3)C 类地址中的私有地址: 192.168.X.X 是私有地址

4、 D 类 IP 地址

               D 类 IP 地址第一个字节以“1110”开始,它是一个专门保留的地址,它并不指向特定的网络,目前这一类地址被用在多点广播(多播, Multicast),多点广播地址用来一次寻址一组计算机,它标识共享同一协议的一组计算机。

(1)、 D 类地址不分网络地址和主机地址,它的第 1 个字节的高四位固定为 1110。

(2)、 D 类地址范围: 224.0.0.1 ~ 239.255.255.254。

5、 E 类 IP 地址

        E 类 IP 地址以“llll0”开始,为将来使用保留。全零(“0.0.0.0” )地址对应于当前主机。全“1”的 IP 地址(“255.255.255.255” )是当前子网的广播地址。

(1)、 E 类地址也不分网络地址和主机地址,它的第 1 个字节的前五位固定为 11110。

(2)、 E 类地址范围: 240.0.0.1 ~ 255.255.255.254。

总结

        以上这 5 类 IP 地址,其中在 A、 B、 C 三类地址中,各保留了一个区域作为私有地址:

        A 类地址: 10.0.0.0~10.255.255.255

        B 类地址: 172.16.0.0~172.31.255.255

         C 类地址: 192.168.0.0~192.168.255.255

        A 类地址的第一组数字为 1~126。

        B 类地址的第一组数字为 128~191。

        C 类地址的第一组数字为 192~223。

        A 类地址的表示范围为: 0.0.0.0~126.255.255.255,默认网络掩码为: 255.0.0.0; A 类地址分配给规模特别大的网络使用。 A 类地址用第一组数字表示网络地址,后面三组数字作为连接于网络上的主机对应的地址。分配给具有大量主机而局域网络个数较少的大型网络,譬如 IBM 公司的网络。

        B 类地址的表示范围为: 128.0.0.0~191.255.255.255,默认网络掩码为: 255.255.0.0; B 类地址分配给一般的中型网络。 B 类地址用第一、二组数字表示网络地址,后面两组数字代表网络上的主机地址。

        C 类地址的表示范围为: 192.0.0.0~223.255.255.255,默认网络掩码为: 255.255.255.0; C 类地址分配给小型网络,如一般的局域网和校园网,它可连接的主机数量是最少的,采用把所属的用户分为若干的网段进行管理。 C 类地址用前三组数字表示网络地址,最后一组数字作为网络上的主机地址。

特殊的 IP 地址
 

下面给大家介绍一些特殊的 IP 地址,这些 IP 地址不能分配给任何一个网络的主机使用


直接广播地址

        直接广播(Direct Broadcast Address):向某个网络上所有的主机发送报文。 TCP/IP 规定,主机号各位全部为“1”的 IP 地址用于广播,叫作广播地址。譬如一个 IP 地址是 192.168.0.181,这是一个 C 类地址,所以它的主机号只有一个字节,那么对主机号全取 1 得到一个广播地址 192.168.0.255,向这个地址发送数据就能让同一网络下的所有主机接收到。

        A、 B、 C 三类地址的广播地址结构如下:

         A 类地址的广播地址为: XXX.255.255.255(XXX 为 A 类地址中网络地址对应的取值范围,譬如:120.255.255.255)。

         B 类地址的广播地址为: XXX.XXX.255.255( XXX 为 B 类地址中网络地址的取值范围,譬如139.22.255.255)

        C 类地址的广播地址为: XXX.XXX.XXX.255(XXX 为 C 类地址中网络地址的取值范围,譬如203.120.16.255)。

受限广播地址

        直接广播要求发送方必须广播网络对应的网络号。但有些主机在启动时,往往并不知道本网络的网络号,这时候如果想要向本网络广播,只能采用受限广播地址(Limited Broadcast Address)。

        受限广播地址是在本网络内部进行广播的一种广播地址, TCP/IP 规定, 32 比特全为“1”的 IP 地址用于本网络内的广播,也就是 255.255.255.255。

多播地址
 

        多播地址用在一对多的通信中,即一个发送者,多个接收者,不论接受者数量的多少,发送者只发送一次数据包。多播地址属于 D 类地址, D 类地址只能用作目的地址,而不能作为主机中的源地址。

环回地址

        环回地址(Loopback Address)是用于网络软件测试以及本机进程之间通信的特殊地址。把 A 类地址中的 127.XXX.XXX.XXX 的所有地址都称为环回地址,主要用来测试网络协议是否工作正常的作用。比如在电脑中使用 ping 命令去 ping 127.1.1.1 就可以测试本地 TCP/IP 协议是否正常。不能将环回地址作为任何一台主机的 IP 地址使用。

0.0.0.0 地址

        IP 地址 32bit 全为 0 的地址(也就是 0.0.0.0)表示本网络上的本主机,只能用作源地址。

        0.0.0.0 是不能被 ping 通的,在服务器中, 0.0.0.0 并不是一个真实的的 IP 地址,它表示本机中所有的IPv4 地址。监听 0.0.0.0 的端口,就是监听本机中所有 IP 的端口。

如何判断 2 个 IP 地址是否在同一个网段内:

        如何判断两个 IP 地址是否处于同一个子网,可通过网络标识来进行判断,网络标识定义如下:

网络标识 = IP 地址 & 子网掩码

        2 个 IP 地址的网络标识相同,那么它们就处于同一网络。譬如 192.168.1.50 和 192.168.1.100,这 2 个都是 C 类地址,对应的子网掩码为 255.255.255.0,很明显,这两个 IP 地址与子网掩码进行按位与操作时得到的结果(网络标识)是一样的,所以它们处于同一网络

5.TCP/IP 协议


        TCP/IP 协议它其实是一个协议族,包含了众多的协议,譬如应用层协议 HTTP、FTP、 MQTT…以及传输层协议 TCP、 UDP 等这些都属于 TCP/IP 协议

5.1.HTTP 协议

        HTTP 超文本传输协议(英文: HyperText Transfer Protocol,缩写: HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。 HTTP 是万维网数据通信的基础。 HTTP 的应用最为广泛,譬如大家经常会打开网页浏览器查询资料,通过浏览器便可开启 HTTP 通信。

        HTTP 协议工作于客户端(用户)、服务器端(网站)模式下,浏览器作为 HTTP 客户端通过 URL 向HTTP 服务端即 WEB 服务器发送请求。 Web 服务器根据接收到的请求后,向客户端发送响应信息。借助这种浏览器和服务器之间的 HTTP 通信,我们能够足不出户地获取网络中的各种信息。

5.2.FTP 协议

        FTP 协议的英文全称为 File Transfer Protocol,简称为 FTP,它是一种文件传输协议从一个主机向一个主机传输文件的协议 FTP 协议同样也是基于客户端-服务器模式,在客户端和服务器之间进行文件传输,譬如我们通常会使用 FTP 协议在两台主机之间进行文件传输,譬如一台 Ubuntu 系统主机和一台 Windows系统主机,将一台主机作为 FTP 服务器、另一台主机作为 FTP 客户端,建立 FTP 连接之后,客户端可以从服务器下载文件,同样也可以将文件上传至服务器。

        FTP 除了基本的文件上传/下载功能外,还有目录操作、权限设置、身份验证等机制,许多网盘的文件传输功能都是基于 FTP 实现的

6.TCP 协议

        TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于 IP 的传输协议。由图 29.2.1 可知, TCP 协议工作在传输层,对上服务 socket 接口,对下调用 IP 层(网络层)。关于 TCP 协议我们需要理解的重点如下:

①、 TCP 协议工作在传输层,对上服务 socket 接口,对下调用 IP 层;

②、 TCP 是一种面向连接的传输协议,通信之前必须通过三次握手与客户端建立连接关系后才可通信;

③、 TCP 协议提供可靠传输,不怕丢包、乱序

TCP 协议如何保证可靠传输?

①、 TCP 协议采用发送应答机制,即发送端发送的每个 TCP 报文段都必须得到接收方的应答,才能认为这个 TCP 报文段传输成功

②、 TCP 协议采用超时重传机制,发送端在发送出一个 TCP 报文段之后启动定时器,如果在定时时间内未收到应答,它将重新发送该报文段。

③、由于 TCP 报文段最终是以 IP 数据报发送的,而 IP 数据报到达接收端可能乱序、重复、所以 TCP协议还会将接收到的 TCP 报文段重排、整理、再交付给应用层

TCP 协议的特性
 

        TCP 协议的特点如下所示:

        面向连接的

        TCP 是一个面向连接的协议,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一个 TCP连接,否则将无法发送数据,通过三次握手建立连接,后面在介绍。

        确认与重传

        当数据从主机 A 发送到主机 B 时,主机 B 会返回给主机 A 一个确认应答; TCP 通过确认应答 ACK 实现可靠的数据传输。当发送端将数据发送出去之后会等待对端的确认应答。如果有确认应答,说明数据已经成功到达对端。反之,数据丢失的可能性比较大。

        在一定的时间内如果没有收到确认应答,发送端就可以认为数据已经丢失,并进行重发。由此,即使产生了丢失,仍然可以保证数据能够到达对端,实现可靠传输。

        全双工通信

        TCP 连接一旦建立,就可以在连接上进行双向的通信。任何一个主机都可以向另一个主机发送数据,数据是双向流通的,所以 TCP 协议是一个全双工的协议

        基于字节流而非报文

        将数据按字节大小进行编号,接收端通过 ACK 来确认收到的数据编号,通过这种机制能够保证 TCP 协议的有序性和完整性,因此 TCP 能够提供可靠性传输。

        流量控制(滑动窗口协议)

        TCP 流量控制主要是针对接收端的处理速度不如发送端发送速度快的问题,消除发送方使接收方缓存溢出的可能性。 TCP 流量控制主要使用滑动窗口协议,滑动窗口是接受数据端使用的窗口大小,用来告诉发送端接收端的缓存大小,以此可以控制发送端发送数据的大小,从而达到流量控制的目的。这个窗口大小就是我们一次传输几个数据。对所有数据帧按顺序赋予编号,发送方在发送过程中始终保持着一个发送窗口,只有落在发送窗口内的帧才允许被发送;同时接收方也维持着一个接收窗口,只有落在接收窗口内的帧才允许接收。这样通过调整发送方窗口和接收方窗口的大小可以实现流量控制

        差错控制

        TCP 协议除了确认应答与重传机制外, TCP 协议也会采用校验和的方式来检验数据的有效性,主机在接收数据的时候,会将重复的报文丢弃,将乱序的报文重组,发现某段报文丢失了会请求发送方进行重发,因此在 TCP 往上层协议递交的数据是顺序的、无差错的完整数据。

        拥塞控制
        如果网络上的负载(发送到网络上的分组数)大于网络上的容量(网络同时能处理的分组数),就可能引起拥塞,判断网络拥塞的两个因素:延时和吞吐量。拥塞控制机制是:开环(预防)和闭环(消除)。

        流量控制是通过接收方来控制流量的一种方式;而拥塞控制则是通过发送方来控制流量的一种方式。TCP 发送方可能因为 IP 网络的拥塞而被遏制, TCP 拥塞控制就是为了解决这个问题(注意和 TCP 流量控制的区别)。

        TCP 拥塞控制的几种方法:慢启动,拥塞避免,快重传和快恢复。

TCP 报文格式:

        数据由上层发送到传输层时,数据会被封装为 TCP 数据段,我们将其称为 TCP 报文(或 TCP 报文段), TCP 报文由 TCP 首部+数据区域组成,一般 TCP 首部通常为 20 个字节大小,具体格式如下图所示:

下面分别对其中的字段进行介绍:
源端口号和目标端口号
 

        源端口号和目标端口号各占 2 个字节,一个 4 个字节,关于端口号的概念会在 29.5.3 小节进行介绍。每个 TCP 报文都包含源主机和目标主机的端口号,用于寻找发送端和接收端应用进程,这两个值加上 IP 首部中的源 IP 地址和目标 IP 地址就能确定唯一一个 TCP 连接。有时一个 IP 地址和一个端口号也称为 socket (插口)。

序号
        占 4 个字节,用来标识从 TCP 发送端向 TCP 接收端发送的数据字节流,它的值表示在这个报文段中的第一个数据字节所处位置码,根据接收到的数据区域长度,就能计算出报文最后一个数据所处的序号,因为TCP 协议会对发送或者接收的数据进行编号(按字节的形式),那么使用序号对每个字节进行计数,就能很轻易管理这些数据。

        在 TCP 传送的数据流中,每一个字节都有一个序号。例如,一报文段的序号为 300,而且数据共 100 字节,则下一个报文段的序号就是 400;序号是 32bit 的无符号数,序号到达 2^32-1 后从 0 开始。

确认序号
 

        确认序号占 4 字节,是期望收到对方下次发送的数据的第一个字节的序号,也就是期望收到的下一个报文段的首部中的序号;确认序号应该是上次已成功收到数据字节序号+1只有 ACK 标志为 1 时,确认序号才有效。 TCP 为应用层提供全双工服务,这意味数据能在两个方向上独立地进行传输,因此确认序号通常会与反向数据(即接收端传输给发送端的数据)封装在同一个报文中(即捎带),所以连接的每一端都必须保持每个方向上的传输数据序号准确性。

首部长度

        首部长度字段占 4 个 bit 位,它指出了 TCP 报文段首部长度,以字节为单位,最大能记录 15*4=60 字节的首部长度,因此, TCP 报文段首部最大长度为 60 字节。在字段后接下来有 6bit 空间是保留未用的,供以后应用,现在置为 0。

6 个标志位: URG/ACK/PSH/RST/SYN/FIN
 

①、 URG: 首部中的紧急指针字段标志,如果是 1 表示紧急指针字段有效

②、 ACK: 只有当 ACK=1 时,确认序号字段才有效。

③、 PSH: 当 PSH=1 时,接收方应该尽快将本报文段立即传送给其应用层。

④、 RST: 当 RST=1 时,表示出现连接错误,必须释放连接,然后再重建传输连接。复位比特还用来拒绝一个不法的报文段或拒绝打开一个连接。

⑤、 SYN: SYN=1, ACK=0 时表示请求建立一个连接,携带 SYN 标志的 TCP 报文段为同步报文段。

⑥、 FIN: 为 1 表示发送方没有数据要传输了,要求释放连接

窗口大小
        占用 2 个字节大小,表示从确认号开始,本报文的发送方可以接收的字节数,即接收窗口大小,用于流量控制

校验和

        对整个的 TCP 报文段,包括 TCP 首部和 TCP 数据,以 16 位字进行计算所得。这是一个强制性的字段。

紧急指针

        本报文段中的紧急数据的最后一个字节的序号。

选项

        选项字段的大小是不确定的,最多 40 字节。

建立 TCP 连接:三次握手
 

        TCP 协议是一个面向连接的协议,双方在进行网络通信之间,都必须先在双方之间建立一条连接,俗称“握手”,三次握手”其实是指建立 TCP 连接的一个过程,通信双方建立一个 TCP 连接需要经过“三次握手”这样一个过程。

        首先建立连接的过程是由客户端发起,而服务器会时刻监听、等待着客户端的连接,其示意图如下所示

(后面全是基于正点原子手册,所以直接放原图了)

关闭 TCP 连接:四次挥手

        四次挥手”(有一些书也会称为四次握手)其实是指关闭 TCP连接的一个过程,当通信双方需要关闭 TCP 连接时需要经过“四次挥手”这样一个过程

        四次挥手即终止 TCP 连接,就是指断开一个 TCP 连接时,需要客户端和服务端总共发送 4 个包以确认连接的断开。在 socket 编程中,这一过程由客户端或服务端任一方执行 close 来触发。

        由于 TCP 连接是全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个 FIN 来终止这一方向的连接,收到一个 FIN 只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个 TCP 连接上仍然能够发送数据,直到这一方向也发送了 FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。

这就是关闭 TCP 连接的四次挥手过程。所以 TCP 协议传输数据的整个过程就如同下图所示

TCP 状态说明

7.UDP 协议

        除了 TCP 协议外,还有 UDP 协议, UDP 是 User Datagram Protocol 的简称,中文名是用户数据报协议,是一种无连接、不可靠的协议,同样它也是工作在传顺层。它只是简单地实现从一端主机到另一端主机的数据传输功能,这些数据通过 IP 层发送,在网络中传输,到达目标主机的顺序是无法预知的,因此需要应用程序对这些数据进行排序处理,这就带来了很大的不方便,此外, UDP 协议更没有流量控制、拥塞控制等功能,在发送的一端, UDP 只是把上层应用的数据封装到 UDP 报文中,在差错检测方面,仅仅是对数据进行了简单的校验,然后将其封装到 IP 数据报中发送出去。而在接收端,无论是否收到数据,它都不会产生一个应答发送给源主机,并且如果接收到数据发送校验错误,那么接收端就会丢弃该UDP 报文,也不会告诉源主机,这样子传输的数据是无法保障其准确性的,如果想要其准确性,那么就需要应用程序来保障了
 

UDP 协议的特点:

①、无连接、不可靠;

②、尽可能提供交付数据服务,出现差错直接丢弃,无反馈;

③、面向报文,发送方的 UDP 拿到上层数据直接添加个 UDP 首部,然后进行校验后就递交给 IP 层,而接收的一方在接收到 UDP 报文后简单进行校验,然后直接去除数据递交给上层应用;

、速度快,因为 UDP 协议没有 TCP 协议的握手、确认、窗口、 重传、拥塞控制等机制, UDP 是一个无状态的传输协议,所以它在传递数据时非常快,即使在网络拥塞的时候 UDP 也不会降低发送的数据。

        UDP 虽然有很多缺点,但也有自己的优点,所以它也有很多的应用场合,因为在如今的网络环境下, UDP 协议传输出现错误的概率是很小的,并且它的实时性是非常好,常用于实时视频的传输,比如直播、网络电话等,因为即使是出现了数据丢失的情况,导致视频卡帧,这也不是什么大不了的事情,所以, UDP协议还是会被应用与对传输速度有要求,并且可以容忍出现差错的数据传输中。

8.端口号的概念
 

        互联网中的每一台主机都需要一个唯一的 IP 地址以标识自己的身份,网络中传输的数据包通过 IP 地址找到对应的目标主机;一台主机通常只有一个 IP 地址,主机上运行的网络进程却通常不止一个,譬如 Windows 电脑上运行着 QQ、微信、钉钉、网页浏览器等,这些进程都需要进行网络连接,它们都可通过网络发送/接收数据,那么这里就有一个问题?主机接收到网络数据之后,如何确定该数据是哪个进程对应的接收数据呢?其实就是通常端口号来确定的。

        端口号本质上就是一个数字编号用来在一台主机中唯一标识一个能上网(能够进行网络通信) 的进程,端口号的取值范围为 0~65535。一台主机通常只有一个 IP 地址,但是可能有多个端口号,每个端口号表示一个能上网的进程。一台拥有 IP 地址的主机可以提供许多服务,比如 Web 服务、 FTP 服务、 SMTP 服务等,这些服务都是能够进行网络通信的进程, IP 地址只能区分网络中不同的主机,并不能区分主机中的这些进程,显然不能只靠 IP 地址,因此才有了端口号。通过“IP 地址+端口号”来区分主机不同的进程。

很多常见的服务器它都有特定的端口号,具体详情如下表所示:
 

  • 34
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值