你必须了解的基础的 Linux 网络命令
2016-09-25 11:38:29 阿炯

本文编辑了一个 Linux 中基础网络命令的列表。它并不是一个教你如何使用这些命令的教程,而是一个命令合集和它们的简短解释。所以如果已经使用过这些命令,可以用它来快速记住命令。希望它能帮助到你。我在计算机网络课程上使用 FreeBSD,不过这些 UNIX 命令应该也能在 Linux 上同样工作。

连通性

ping <host>:发送 ICMP echo 消息(一个包)到主机。这可能会不停地发送直到你按下 Control-C。Ping 的通意味着一个包从你的机器通过 ICMP 发送出去,并在 IP 层回显。Ping 告诉你另一个主机是否在运行。

telnet <host> [port]:与主机在指定的端口通信。默认的 telnet 端口是 23。按 Control-] 以退出 telnet。其它一些常用的端口是:

7 -- echo 端口

25 -- SMTP,用于发送邮件

79 -- Finger (LCTT 译注:维基百科 - Finger protocal,不过举例 Finger 恐怕不合时宜,倒不如试试 80?),提供该网络下其它用户的信息。

ARP

ARP 用于将 IP 地址转换为以太网地址。root 用户可以添加和删除 ARP 记录。当 ARP 记录被污染或者错误时,删除它们会有用。root 显式添加的 ARP 记录是永久的 -- 代理设置的也是。ARP 表保存在内核中,动态地被操作。ARP 记录会被缓存,通常在 20 分钟后失效并被删除。

arp -a:打印 ARP 表。

arp -s <ip_address> <mac_address> [pub]:添加一条记录到表中。

arp -a -d:删除 ARP 表中的所有记录。

路由

netstat -r:打印路由表。路由表保存在内核中,用于 IP 层把包路由到非本地网络。

route add:route 命令用于向路由表添加静态(手动指定而非动态)路由路径。所有从该 PC 到那个 IP/子网的流量都会经由指定的网关 IP。它也可以用来设置一个默认路由。例如,在 IP/子网处使用 0.0.0.0,就可以发送所有包到特定的网关。

routed:控制动态路由的 BSD 守护程序。开机时启动。它运行 RIP 路由协议。只有 root 用户可用。没有 root 权限你不能运行它。

gated:gated 是另一个使用 RIP 协议的路由守护进程。它同时支持 OSPF、EGP 和 RIP 协议。只有 root 用户可用。

traceroute:用于跟踪 IP 包的路由。它每次发送包时都把跳数加 1,从而使得从源地址到目的地之间的所有网关都会返回消息。

netstat -rnf inet:显示 IPv4 的路由表。

sysctl net.inet.ip.forwarding=1:启用包转发(把主机变为路由器)。

route add|delete [-net|-host] <destination> <gateway>:(如 route add 192.168.20.0/24 192.168.30.4)添加一条路由。

route flush:删除所有路由。

route add -net 0.0.0.0 192.168.10.2:添加一条默认路由。

routed -Pripv2 -Pno_rdisc -d [-s|-q]:运行 routed 守护进程,使用 RIPv2 协议,不启用 ICMP 自动发现,在前台运行,供给模式或安静模式。

route add 224.0.0.0/4 127.0.0.1:为本地地址定义多播路由。(LCTT 译注:原文存疑)

rtquery -n <host>(LCTT 译注:增加了 host 参数):查询指定主机上的 RIP 守护进程(手动更新路由表)。

其它


nslookup:向 DNS 服务器查询,将 IP 转为名称,或反之。例如,nslookup freeoa.net 会给出 freeoa.net 的 IP。

ftp <host> [port](LCTT 译注:原文中 water 应是笔误):传输文件到指定主机。通常可以使用 登录名 "anonymous" , 密码 "guest" 来登录。

rlogin -l <host>(LCTT 译注:添加了 host 参数):使用类似 telnet 的虚拟终端登录到主机。

重要文件

/etc/hosts:域名到 IP 地址的映射。

/etc/networks:网络名称到 IP 地址的映射。

/etc/protocols:协议名称到协议编号的映射。

/etc/services:TCP/UDP 服务名称到端口号的映射。

工具和网络性能分析

ifconfig <interface> <address> [up]:启动接口。

ifconfig <interface> [down|delete]:停止接口。

ethereal &:在后台打开 ethereal 而非前台。

tcpdump -i -vvv:抓取和分析包的工具。

netstat -w [seconds] -I [interface]:显示网络设置和统计信息。

udpmt -p [port] -s [bytes] target_host:发送 UDP 流量。

udptarget -p [port]:接收 UDP 流量。

tcpmt -p [port] -s [bytes] target_host:发送 TCP 流量。

tcptarget -p [port]:接收 TCP 流量。

交换机

ifconfig sl0 srcIP dstIP:配置一个串行接口(在此前先执行 slattach -l /dev/ttyd0,此后执行 sysctl net.inet.ip.forwarding=1)

telnet 192.168.0.254:从子网中的一台主机访问交换机。

sh ru 或 show running-configuration:查看当前配置。

configure terminal:进入配置模式。

exit:退出当前模式。(LCTT 译注:原文存疑)

VLAN

vlan n:创建一个 ID 为 n 的 VLAN。

no vlan N:删除 ID 为 n 的 VLAN。

untagged Y:添加端口 Y 到 VLAN n。

ifconfig vlan0 create:创建 vlan0 接口。

ifconfig vlan0 vlan_ID vlandev em0:把 em0 加入到 vlan0 接口(LCTT 译注:原文存疑),并设置标记为 ID。

ifconfig vlan0 [up]:启用虚拟接口。

tagged Y:为当前 VLAN 的端口 Y 添加标记帧支持。

UDP/TCP

socklab udp:使用 UDP 协议运行 socklab。

sock:创建一个 UDP 套接字,等效于输入 sock udp 和 bind。

sendto <Socket ID> <hostname> <port #>:发送数据包。

recvfrom <Socket ID> <byte #>:从套接字接收数据。

socklab tcp:使用 TCP 协议运行 socklab。

passive:创建一个被动模式的套接字,等效于 socklab,sock tcp,bind,listen。

accept:接受进来的连接(可以在发起进来的连接之前或之后执行)。

connect <hostname> <port #>:等效于 socklab,sock tcp,bind,connect。

close:关闭连接。

read <byte #>:从套接字中读取 n 字节。

write:(例如,write ciao、write #10)向套接字写入 "ciao" 或 10 个字节。

NAT/防火墙

rm /etc/resolv.conf:禁止地址解析,保证你的过滤和防火墙规则正确工作。

ipnat -f file_name:将过滤规则写入文件。

ipnat -l:显示活动的规则列表。

ipnat -C -F:重新初始化规则表。

map em0 192.168.1.0/24 -> 195.221.227.57/32 em0:将 IP 地址映射到接口。

map em0 192.168.1.0/24 -> 195.221.227.57/32 portmap tcp/udp 20000:50000:带端口号的映射。

ipf -f file_name:将过滤规则写入文件。

ipf -F -a:重置规则表。

ipfstat -I:当与 -s 选项合用时列出活动的状态条目(LCTT 译注:原文存疑)。


希望这份基础的 Linux 网络命令合集对你有用,欢迎各种问题和建议。英文原文链接

作者:Abhishek Prakash 译者:bianjp 校对:wxy

上文源自:Linux中国


计算机网络的 166 个核心概念(转自智能改变世界博客,作为上文的补充)

计算机网络基础概念

主机:计算机网络上任何一种能够连接网络的设备都被称为主机或者说是端系统,比如手机、平板电脑、电视、游戏机、汽车等,随着 5G 的到来,将会有越来越多的终端设备接入网络。
通信链路:通信链路是由物理链路(同轴电缆、双绞线、光纤灯)连接到一起组成的一种物理通路。
传输速率:单位是 bit/s ,用来度量不同链路从一个端系统到另一个端系统传输数据的速率。
分组:当一台端系统向另外一台端系统发送数据时,通常会将数据进行分片,然后为每段加上首部字节,从而形成计算机网络的专业术语:分组。这些分组通过网络发送到端系统,然后再进行数据处理。
转发表:路由内部记录报文路径的映射关系的一种记录。
路由器:英文术语 router,路由器是连接因特网中各局域网、广域网的设备。路由器中维护着路由表,数据发送前路由器会查询路由表,然后根据路由表中记录的信息选择最佳传输路径,它是一种网络层的设备。
交换机:英文术语 switch,是一种光电信号转发设备,它可以为接入交换机的任意两个网络节点提供独享的电信号通路,它是一种数据链路层设备。
集线器:英文术语 hub,它是一种能够将多条以太网双绞线或光纤集合连接在同一段物理介质下的设备。它发生在物理层。



交换机和集线器的功能非常相似,交换机具有记忆功能,它广播之后能够缓存目标 Mac,后续的数据包就会直接通过缓存的路径发送,交换机是一种全双工通信模式。而集线器工作的时候,如果局域网中的一台电脑要发送消息,则局域网内的所有电脑都可以接收到这个消息,安全性较差,而且集线器是一种半双工模式。所以现在大多数都是用交换机,集线器慢慢被淘汰了。

半双工模式:连接在集线器中的端系统每次只能有数据包一个发送,只有这个发送完毕其他电脑才能再发送,这称为半双工模式。
全双工模式:连接在交换机中的端系统可以彼此之间相互通信,相互发送消息互不影响。
路径:一个分组所经历一系列通信链路和分组交换机称为通过这个网络的路径。
因特网服务商:ISP,不是 lsp(lao se pi)。这个好理解,就是网络运营商,我国的三大运营商:移动、电信、联通。
网络协议:网络协议是计算机网络中进行数据交换而建立的规则、标准或者约定。
IP:网际协议,它规定了路由器和端系统之间发送和接收的分组格式。
TCP/IP 协议簇:不仅仅只有 TCP 协议和 IP 协议,而是以 TCP、IP 协议为主的一系列协议,比如 ICMP 协议、ARP 协议、UDP 协议、DNS 洗衣、SMTP 协议等。
丢包:在计算机网络中指的是分组出现丢失的现象。
吞吐量:吞吐量在计算机网络中指的是单位时间内成功传输数据的数量。
报文:通常指的是应用层的分组。
报文段:通常把运输层的分组称为报文段。
数据报:通常将网络层的分组称为数据报。
帧:一般把链路层的分组称为帧。
电路交换:是通信网中最早出现的一种交换方式,一般多用于电话网,电路交换的过程中,数据交换是独占信道的,电路交换方式的优点是数据传输可靠、迅速,数据不会丢失,缺点是电路空闲时信道容量容易被浪费。
报文交换:报文交换是先将整个报文传送到临界点,全部存储下来之后再转发到下一个节点。
分组交换:分组交换是通信双方以分组为单位、使用存储-转发机制实现数据交互的通信方式,分组交换不会独占信道,从而资源利用率比较高。缺点是时延抖动、开销比较大。
带宽:带宽指单位时间能通过链路的数据量。通常以 bps 来表示,即每秒可传输的位数。
频分复用:多用于模拟信号,频分复用的各路信号是并行的。
时分复用:多用于数字信号,时分复用的各路信号是串行的。
时延:时延指的是一个报文或者分组从网络的一端传递到另一端所需要的时间,时延分类有发送时延、传播时延、处理时延、排队时延,总时延的计算方式:总时延 = 发送时延 + 传播时延 + 处理时延 + 排队时延。
处理时延:检查分组首部和决定分组传输路径所需要的时延被称为处理时延。
排队时延:分组在链路上等待的时间被称为处理时延。
传输时延:在实际链路中由一端传到网络从开始发送分组到发送完毕所耗费的时间被称为传输时延,可以理解为推出分组所需要的时间。
传播时延:分组从一台路由器传播到另一台路由器所需要的时间。
单播:单播最大的特点就是 1 对 1,早期的固定电话就是单播的一个例子
广播:我们一般小时候经常会广播体操,这就是广播的一个事例,主机和与他连接的所有端系统相连,主机将信号发送给所有的端系统。


多播:多播与广播很类似,也是将消息发送给多个接收主机,不同之处在于多播需要限定在某一组主机作为接收端。


任播:任播是在特定的多台主机中选出一个接收端的通信方式。虽然和多播很相似,但是行为与多播不同,任播是从许多目标机群中选出一台最符合网络条件的主机作为目标主机发送消息。然后被选中的特定主机将返回一个单播信号,然后再与目标主机进行通信。



计算机网络应用层

应用程序体系结构:其实就是应用层程序的两种组织结构,分为 CS 和 P2P。
客户-服务体系:它是一种面向网络应用的体系结构。把系统中的不同端系统区分为客户和服务器两类,客户向服务器发出服务请求,由服务器完成所请求的服务,并把处理结果回送给客户。在客户-服务器体系结构中,有一个总是打开的主机称为 服务器(Server),它提供来自于 客户(client) 的服务。我们最常见的服务器就是 Web 服务器,Web 服务器服务于来自 浏览器 的请求。

P2P 体系:对等体系结构,相当于没有服务器了,大家都是客户机,每个客户既能发送请求,也能对请求作出响应。


进程:进程其实就是运行在端系统的程序,应用程序进行通信的最基本单位就是进程。
分布式应用程序:多个端系统之间相互交换数据的端系统被称为分布式应用程序。
套接字接口:指的就是 socket 接口,这个接口规定了端系统之间通过因特网进行数据交换的方式。


客户端:在客户-服务器架构中扮演请求方的角色,通常是 PC,智能手机等端系统。
服务器:在客户-服务器架构中扮演服务方的角色,通常是大型服务器集群扮演服务器的角色。
IP 地址:IP 地址就是网际协议地址,在互联网中唯一标识主机的一种地址。每一台入网的设备都会有一个 IP 地址,这个 IP 又分为内网 IP 和公网 IP。
端口号:在同一台主机内,端口号用于标识不同应用程序进程。
URI:它的全称是(Uniform Resource Identifier),中文名称是统一资源标识符,使用它就能够唯一地标记互联网上资源。
URL:它的全称是(Uniform Resource Locator),中文名称是统一资源定位符,它实际上是 URI 的一个子集。


HTML:HTML 称为超文本标记语言,是一种标识性的语言。它包括一系列标签.通过这些标签可以将网络上的文档格式统一,使分散的 Internet 资源连接为一个逻辑整体。HTML 文本是由 HTML 命令组成的描述性文本,HTML 命令可以说明文字,图形、动画、声音、表格、链接等。
Web 页面:Web 页面也叫做 Web Page,它是由对象组成,一个对象(object) 简单来说就是一个文件,这个文件可以是 HTML 文件、一个图片、一段 Java 应用程序等,它们都可以通过 URI 来找到。一个 Web 页面包含了很多对象,Web 页面可以说是对象的集合体。
Web 服务器:Web 服务器的正式名称叫做 Web Server,Web 服务器可以向浏览器等 Web 客户端提供文档,也可以放置网站文件,让全世界浏览;可以放置数据文件,让全世界下载。目前最主流的三个 Web 服务器是 Apache、 Nginx 、IIS。
CDN:CDN 的全称是Content Delivery Network,即内容分发网络,它应用了 HTTP 协议里的缓存和代理技术,代替源站响应客户端的请求。CDN 是构建在现有网络基础之上的网络,它依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。
专用 CDN:由内容提供商特有 CDN 。
第三方 CDN:它代表多个内容提供商提供服务。
WAF:WAF 是一种应用程序防护系统,它是一种通过执行一系列针对 HTTP / HTTPS的安全策略来专门为 Web 应用提供保护的一款产品,它是应用层面的防火墙,专门检测 HTTP 流量,是防护 Web 应用的安全技术。
WebService :WebService 是一种 Web 应用程序,WebService 是一种跨编程语言和跨操作系统平台的远程调用技术
HTTP: TCP/IP 协议簇的一种,它是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范。
Session:Session 其实就是客户端会话的缓存,主要是为了弥补 HTTP 无状态的特性而设计的。服务器可以利用 Session 存储客户端在同一个会话期间的一些操作记录。当客户端请求服务端时,服务端会为这次请求开辟一块内存空间,这个对象便是 Session 对象,存储结构为 ConcurrentHashMap。
Cookie:HTTP 协议中的 Cookie 包括 Web Cookie 和浏览器 Cookie,它是服务器发送到 Web 浏览器的一小块数据。服务器发送到浏览器的 Cookie,浏览器会进行存储,并与下一个请求一起发送到服务器。通常,它用于判断两个请求是否来自于同一个浏览器,例如用户保持登录状态。
SMTP 协议 :提供电子邮件服务的协议叫做 SMTP 协议, SMTP 在传输层也使用了 TCP 协议。SMTP 协议主要用于系统之间的邮件信息传递,并提供有关来信的通知。
POP3:邮件访问协议,协议较为简单,功能有限。
DNS 协议:由于 IP 地址是计算机能够识别的地址,而我们人类不方便记忆这种地址,所以为了方便人类的记忆,使用 DNS 协议,来把我们容易记忆的网络地址映射称为主机能够识别的 IP 地址。


根 DNS 服务器:最顶级的 DNS 服务器,全世界有 400 多台根域名服务器,由 13 个不同的组织管理,根域名服务器提供 TLD 服务器的 IP 地址。
顶级域 DNS 服务器:这个我们比较熟悉,像是常见的顶级域(如 com、org、net、edu 和 gov)和所有的国家顶级域(uk、fr、ca 和 jp),TLD 服务器提供了权威 DNS 服务器的 IP 地址。
权威 DNS 服务器:这个服务器就是因特网上具有公共可访问主机的 DNS 记录的服务器。
本地 DNS 服务器:一般来说,每个 ISP 都有一台本地 DNS 服务器,本地 DNS 服务器会临近主机端。


TELNET 协议:远程登陆协议,它允许用户(Telnet 客户端)通过一个协商过程来与一个远程设备进行通信,它为用户提供了在本地计算机上完成远程主机工作的能力。


SSH 协议:SSH 是一种建立在应用层上的安全加密协议。因为 TELNET 有一个非常明显的缺点,那就是在主机和远程主机的发送数据包的过程中是明文传输,未经任何安全加密,这样的后果是容易被互联网上不法分子嗅探到数据包来搞一些坏事,为了数据的安全性,我们一般使用 SSH 进行远程登录。
FTP 协议:文件传输协议,是应用层协议之一。FTP 协议包括两个组成部分,分为 FTP 服务器和 FTP 客户端。其中 FTP 服务器用来存储文件,用户可以使用 FTP 客户端通过 FTP 协议访问位于 FTP 服务器上的资源。FTP 协议传输效率很高,一般用来传输大文件。


MIME 类型,它表示的是互联网的资源类型,一般类型有 超文本标记语言文本 .html text/html、xml文档 .xml text/xml、普通文本 .txt text/plain、PNG图像 .png image/png、GIF图形 .gif image/gif、JPEG图形 .jpeg,.jpg image/jpeg、AVI 文件 .avi video/x-msvideo 等。
多路分解:在接收端,运输层会检查源端口号和目的端口号等字段,然后标识出接收的套接字,从而将运输层报文段的数据交付到正确套接字的过程被称为多路分解。
多路复用:在发送方,从不同的套接字中收集数据块,然后为数据块封装上首部信息从而生成报文段,然后将报文段传递给网络层的过程被称为多路复用。
周知端口号:在主机的应用程序中,从 0 - 1023 的端口号是受限制的,被称为周知端口号,这些端口号一般不能占用。

计算机网络传输层

可靠数据传输:确保数据能够从程序的一端准确无误的传递给应用程序的另一端。
容忍丢失的应用:应用程序在发送数据的过程中可能会存在数据丢失的情况。
非持续连接:每个请求/响应会对经过不同的连接,每一个连接都会经过建立、保持、销毁这个过程。并且每个请求/响应后都会断开连接。
持续连接:每个请求/响应都会经过相同的连接,也就是说每个请求/响应都可以复用这个连接,并且在每个请求/响应后不会断开连接。
传输控制协议:英文名 TCP,通过名称可以大致知道 TCP 协议有控制传输的功能,主要体现在其可控,可靠性。TCP 为应用层提供了一种可靠的、面向连接的服务,它能够将分组可靠的传输到其他主机。
用户数据包协议:英文名 UDP,它为应用层提供了一种无需建立连接就可以直接发送数据报的方法。
三次握手:TCP 连接的建立需要经过三个报文段的发送,这种连接的建立过程被称为三次握手。
最大报文段长度:即 MSS,它指的是从缓存中取出并放入报文段中的最大值。
最大传输单元:即 MTU,它指的是通信双方能够接收有效载荷的大小,MSS 通常会根据 MTU 来设。
冗余 ACK:就是再次确认某个报文段的 ACK,报文段的丢失会导致冗余 ACK 的出现。
快速重传:即在报文段定时器过期之前重传丢失的报文段。
选择确认:在报文段出现丢失的情况下,TCP 能够选择确认失序的报文段,这个机制通常和重传一起使用。
拥塞控制:拥塞控制说的是,当某一段时间网络中的分组过多,使得接收端来不及处理,从而引起部分甚至整个网络性能下降的现象时采取的一种抑制发送端发送数据,等过一段时间或者网络情况改善后再继续发送报文段的一种方法。
四次挥手:TCP 断开链接需要经过四个报文段的发送,这种断开过程是四次挥手。
发送缓存:英文 send buffer,在发送报文时,TCP 不会立刻将报文发送出去,而是存储到内核的发送缓冲区中,等待合适的时机再发送。
接收缓存:英文 receive buffer,同样在接收报文时,主机不会立刻对报文进行处理,而是存储到内核的接收缓冲区中,等待合适的时机再进行处理。

SYN:Synchronize Sequence Numbers,是 TCP/IP 建立连接时发送的数据包,这个数据包就是一个同步序列号,标识客户端发送的是哪个请求。
ACK:Acknowledge character,ACK 是对请求进行响应的数据包。
FIN:Finish ,带有 FIN 标志位的数据包表示客户端希望断开连接。
三次握手中的状态变化
LISTEN: 表示等待任何来自远程 TCP 和端口的连接请求。
SYN-SEND: 表示发送连接请求后等待匹配的连接请求。
SYN-RECEIVED: 表示已接收并发送连接请求后等待连接确认,也就是 TCP 三次握手中第二步后服务端的状态
ESTABLISHED: 表示已经连接已经建立,可以将应用数据发送给其他主机
四次挥手中的状态变化
FIN-WAIT-1: 表示等待来自远程 TCP 的连接终止请求,或者等待先前发送的连接终止请求的确认。
FIN-WAIT-2: 表示等待来自远程 TCP 的连接终止请求。
CLOSE-WAIT: 表示等待本地用户的连接终止请求。
CLOSING: 表示等待来自远程 TCP 的连接终止请求确认。
LAST-ACK: 表示等待先前发送给远程 TCP 的连接终止请求的确认(包括对它的连接终止请求的确认)。
TIME-WAIT: 表示等待足够的时间以确保远程 TCP 收到其连接终止请求的确认。
CLOSED: 表示连接已经关闭,无连接状态。
滑动窗口:英文 sliding window,它是一种流量控制技术,在互联网早期,通信双方通常不会考虑网络情况,一般都会直接进行通信,同时发送数据,很容易导致阻塞,谁也发不了数据,针对这种现象,提出了滑动窗口,通过滑动窗口,接收方会告诉发送方自己能够接收多少数据。
窗口长度:窗口长度指的是已发送但还未确认的分组范围,如下图中的发送窗口结构就是窗口长度。

累积确认:TCP 规定在一段时间内发送方只要收到最后一条接收方返回的确认 ACK ,而不用重传报文段。
冗余ACK:由于 TCP 采用的是累计确认机制,即当接收端收到比期望序号大的报文段时,便会重复发送最近一次确认的报文段的确认信号,我们称之为冗余 ACK。
选择确认:可选择性的确认失序报文段,而不是重传最后一个报文段。

计算机网络网络层

路由选择算法:网络层中决定分组发送路径的一种算法。
转发:它指的是将分组从一个输入链路转移到合适的输出链路的动作。
路由选择:指确定分组从一端发送到另一端所选择路径的处理过程。
三种路由交换技术:内存交换、总线交换、互联网络交换。
分组调度:分组调度讨论的是分组如何经输出链路传输的问题,主要有三种调度方式:先进先出、优先级排队和"循环和加权公平排队"。
先入先出:FIFO,或者称为 FCFS,先到达的分组优先进行处理。
优先权排队:priority queue,到达输出链路的分组会被放入优先级队列里面。

循环排队规则:round robin queuing discipline,这种就是循环调度器会在队列进行轮流提供服务。

IPv4:网际协议的第四个版本,也是被广泛使用的一个版本。IPv4 是一种无连接的协议,无连接不保证数据的可靠性交付。使用 32 位的地址。
IPv6:网际协议的第六个版本,IPv6 的地址长度是 128 位,由于 IPv4 最大的问题在于网络地址资源不足,严重制约了互联网的应用和发展。IPv6 的使用,不仅能解决网络地址资源数量的问题,而且也解决了多种接入设备连入互联网的障碍。
接口:主机和物理链路之间的边界。
ARP 协议:ARP 是一种解决地址问题的协议,通过 IP 位线索,可以定位下一个用来接收数据的网络设备的 MAC 地址。如果目标主机与主机不在同一个链路上时,可以通过 ARP 查找下一跳路由的地址。不过 ARP 只适用于 IPv4 ,不适用于 IPv6。
RARP:RARP 就是将 ARP 协议反过来,通过 MAC 地址定位 IP 地址的一种协议。


代理 ARP:用于解决 ARP 包被路由器隔离的情况,通过代理 ARP 可以实现将 ARP 请求转发给临近的网段。
ICMP 协议:Internet 报文控制协议,如果在 IP 通信过程中由于某个 IP 包由于某种原因未能到达目标主机,那么将会发送 ICMP 消息,ICMP 实际上是 IP 的一部分。


DHCP 协议:DHCP 是一种动态主机配置协议,又被称为即插即用协议或者零配置协议,使用 DHCP 就能实现自动设置 IP 地址、统一管理 IP 地址分配,实现即插即用。
NAT 协议:网络地址转换协议,它指的是所有本地地址的主机在接入网络时,都会要在 NAT 路由器上讲其转换成为全球 IP 地址,才能和其他主机进行通信。
NAT 转换表:和路由表类似,NAT 转换表记录了私有 IP 地址和公共 IP 地址的转换记录。
NAT 穿越:NAT 穿越用来解决处于使用了 NAT 设备的私有 TCP/IP 网络中主机之间建立连接的问题。
IP 隧道:IP 隧道技术说的是由路由器把网络层协议封装到另一个协议中从而跨过网络传输到另外一个路由器的过程。
OSPF:是根据 OSI 的 IS-IS 协议提出的一种链路状态型协议。这种协议还能够有效的解决网络环路问题。
BGP:边界网关协议,这个协议将因特网中数以千计的 ISP 连接起来。
IGP:内部网关协议,一般用于企业内部自己搭建的路由自治系统。
EGP:外部网关协议,EGP 通常用于在网络主机之间相互交换路由信息。
RIP :一种距离向量型路由协议,广泛应用于 LAN 网。

计算机网络数据链路层和物理层

节点:一般指链路层协议中的设备。
链路:一般把沿着通信路径连接相邻节点的通信信道称为链路。
MAC 协议:媒体访问控制协议,它规定了帧在链路上传输的规则。
奇偶校验位:一种差错检测方式,多用于计算机硬件的错误检测中,奇偶校验通常用在数据通信中来保证数据的有效性。
向前纠错:接收方检测和纠正差错的能力被称为向前纠错。
以太网:以太网是一种当今最普遍的局域网技术,它规定了物理层的连线、电子信号和 MAC 协议的内容。
VLAN:虚拟局域网(VLAN)是一组逻辑上的设备和用户,这些设备和用户并不受物理位置的限制,可以根据功能、部门及应用等因素将它们组织起来,相互之间的通信就好像它们在同一个网段中一样,所以称为虚拟局域网。
基站:无线网络的基础设施。
奇偶校验位:一种进行差错检测的方式。
向前纠错:接收方检测和纠正差错的能力被称为向前纠错,也就是 FEC。
校验和:checksum,在数据处理和数据通信领域中,用于校验目的地一组数据项的和。
循环冗余检测:CRC ,一种现如今正在使用的差错检测技术,使用多项式来进行差错检测。
CSMA/CD:具有碰撞的载波侦听多路访问,CSMA/CD 会要求每个介质提前检查一下链路上是否有可能产生冲突的现象,一旦发生冲突,那么尽可能早地释放信道。
共享介质型网络:故名思义就是多个设备共同使用同一个通信介质的网络。
非共享介质型网络:与共享介质型网络相对,这种网络不会使用相同的通信介质。
令牌环:一种共享介质型网络传输方式。


过滤:在链路层是决定一个帧应该转发到某个接口还是应当将其丢弃的交换机的一种功能。
转发:转发决定一个帧应该导向那个接口,并把帧移动到那些接口的交换机的一种功能。
交换机表:交换机的过滤和转发功能都依靠交换机表来完成。
MPLS:它是一种标记交换技术,标记交换会对每个 IP 数据包都设定一个标记,然后根据这个标记进行转发。

计算机网络安全

安全通信的四大要素:机密性、保温完整性、端点鉴别和运行安全性。
机密性:报文需要在一定程度上进行加密,用来防止窃听者截取报文。
报文完整性:在报文传输过程中,需要确保报文的内容不会发生改变。
端点鉴别:发送方和接收方都应该证实通信过程中所对方的身份。
运行安全性:设施保护报文防止被攻击的能力。
明文:没有被加密过的内容都被称为明文。
加密算法:对原来明文的文件或数据按照某种算法进行处理,这种算法就是加密算法。
密文:对明文进行加密生成后的报文称为密文。
解密算法:对密文进行解密的算法。
密钥:解密算法对密文进行解密的工具叫做密钥。
对称加密:采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。
块密码:块密码也叫做分组密码,顾名思义,它把加密和解密序列分成了一个个分组,最后把每一块序列合并到一起,形成明文或者密文。
流密码:流密码也叫做序列密码,每次加密都通过密钥生成一个密钥流,解密也是使用同一个密钥流,明文与同样长度的密钥流进行异或运算得到密文,密文与同样的密钥流进行异或运算得到明文。
公钥:公钥是与私钥算法一起使用的密钥对的非秘密一半。公钥通常用于加密会话密钥、验证数字签名,或加密可以用相应的私钥解密的数据
私钥:私钥通常是公钥的另一半,私钥只有自己知道,可以用来加密或解密。
CA 认证中心,CA 的职责就是使识别和发行证书合法化。
防火墙:一种软硬件结合体,将机构的内部网络和整个因特网隔离,允许一些分组通过,阻止一些分组通过。
防火墙一般分为三种:分组过滤器、状态过滤器和应用程序网关。
分组过滤器:机构将内部网络与外部网络进行隔离,所有离开和进入内部网络的分组都会经过这个路由器,这个路由器会检查每个分组的信息。
状态分组过滤器:根据分组中的 TCP 连接状态进行过滤。
应用程序网关:一个应用程序网关是一个特定的应用程序,所有应用程序的数据都会经过它。
入侵检测系统:观察到潜在恶意流量时能够产生警告的设备称为入侵检测系统
入侵防止系统:过滤恶意流量的设备称为入侵防止系统。

小结

计算机网络范围内重点概念非常多,这篇文章我总结了一部分我认为应该重点了解的概念,也许有一些概念解释的没那么清晰,你可以作为一个参考或者说索引,等遇到相关概念时,能够大致理解其意思,那么这篇文章的目的就达到了。


详解 TCP 和 UDP网络协议

先来一张全景图快速了解整篇文章的内容。

上帝视角

初始传输层

前面说过,传输层的作用是建立应用程序间的端到端连接,为数据传输提供可靠或不可靠的通信服务。传输层有两个重要协议,分别是 TCP 和 UDP。TCP是面向连接的可靠传输协议,UDP是无连接的不可靠传输协议。

传输层协议

一个IP 地址可以标识一台主机,IP 报文头部有一个字段,用来标识上层协议类型。根据这个字段的协议号,来识别 IP 传输的数据是 TCP 还是 UDP 。IP 用协议号 6 标识 TCP ,用协议号 17 标识 UDP 。但一台主机可能同时有多个程序,传输层的 TCP 和 UDP ,为了识别上一层的应用程序类型,使用端口号来识别具体的程序,从而使这些程序可以复用网络通道。

协议号和端口号

二层的帧通信和三层的包通信都是无连接的、不可靠的通信方式,四层的 TCP 却是一种可靠的通信方式。如果帧在传输中丢失,通信双方的二层功能模块发现不了;如果包在传输中丢失,通信双方的三层功能模块发现不了。燃鹅,一个 TCP 段丢失了,TCP 模块一定能够发现。一个 TCP 段的丢失,意味着一个 IP 包的丢失,因为 TCP 段是封装在 IP 包里的;同理,一个 IP 包的丢失,意味着一个帧的丢失。因此,二层和三层通信的不可靠性在 TCP 这里得到补偿。

数据封装

应用程序其实就是 TCP/IP 的应用协议,应用协议大多以客户端/服务端的形式运行。客户端( Client ,使用服务的一方。)是请求的发起端。而服务端( Server ,提供服务的程序或主机。)则是请求的处理端。作为服务端的程序有必要提前启动,随时准备接收客户端的请求。否则即使有客户端的请求发过来,也无法进行处理。


确认一个请求究竟是发给哪一个服务端,可以通过收到数据包的目的端口号轻松识别。当收到 TCP 的建立连接请求时,如果目的端口号是22,则转给SSH,如果是80则转给HTTP。

TCP

TCP是面向连接的、可靠的流协议。流就是不间断的数据,当应用程序采用 TCP 发送消息时,虽然是按顺序发送,但接收端收到是没有间隔的数据流。比如,在发送端应用程序发送了 10 次 100 字节的数据,那么在接收端,应用程序可能会收到一个 1000 字节连续不间断的数据。

可靠传输

TCP为提供可靠性传输,实行顺序控制、重发控制机制。此外还有流量控制、拥塞控制、提高网络利用率等众多功能。

UDP

**UDP **是不具有可靠性的协议,可靠性功能交给上层的应用去完成。UDP 虽然可以确保发送数据的大小,比如:发送端应用程序发送一个 100 字节的消息,那么接收端应用程序也会以 100 字节为长度接收数据。但不能保证数据一定会到达。因此,应用有时会根据需要进行重发处理。

不可靠传输

TCP 和 UDP 的区别

TCP 是可靠的传输协议,一定会优于 UDP 吗?其实不然,TCP是面向连接的,并且具备顺序控制、重发控制等机制,可以为应用提供可靠传输。而 UDP 主要用于对高速传输和实时性有较高要求的通信。比如:通过 IP 电话进行通话。如果使用 TCP ,数据如果丢失会重发,这样就无法流畅地传输通话的声音,导致无法进行正常交流。而采用 UDP ,它不会进行重发处理。也就不会有声音大幅度延迟到达的问题。即使有部分数据丢失,也只会影响小部分的通话。因此,TCP 和 UDP 需要根据应用的目的选择使用。

端口号

数据链路层和网络层的地址,分别是 MAC 地址和 IP 地址。MAC 地址用来标识同一网段中不同的设备,IP 地址标识网络中的主机或路由器。传输层的地址就是端口号,端口号用来识别同一台主机中不同的应用程序,也被称为程序地址。

一台主机可以同时运行多个程序,比如WWW服务的 Web 浏览器、电子邮箱客户端等程序都可同时运行。传输层协议正是利用这些端口号,识别主机正在进行通信的应用程序,并准确的传输数据。

端口号

仅仅通过目的端口来识别某一个通信是不准确的。两台主机访问的目的端口号80相同,可以根据源端口号区分这两个通信。

目的端口号和源端口号相同,但是两台主机的源 IP地址不同;IP 地址和端口号都一样,只是协议号不同。这些情况,都会认为是两个不同的通信。

因此,网络通信中通常采用 5 个信息来识别一个通信。它们是源 IP 地址、目的 IP 地址、协议号、源端口号、目的端口号。只要其中一项不同,就会认为是不同的通信。

会话五元素

TCP/UDP 的端口号是一个 16 位二进制数,端口号范围为0 ~ 65535。在实际进行通信时,要事先确定端口号。确定端口号的方法分为两种:

标准端口号

这种方法也叫静态方法。它是指每个应用程序都有指定的端口号。HTTP 、TELNET 、FTP 等常用的应用程序所使用的端口号是固定的,这些端口号又称为知名端口号。知名端口号范围是0 ~ 1023。

除了知名端口号外,还有一些端口号也被正式注册,称为注册端口。它们分布在1024 ~ 49151之间。

时序分配法

这种方法也叫动态分配法。服务端有必要确定监听的端口号,但是接受服务的客户端不需要确定端口号。

客户端应用程序不用设置端口号,由操作系统进行分配。操作系统可以为每个应用程序分配不冲突的端口号。比如:每需要一个新的端口号时,就在之前分配号码的基础上加 1 。这样,操作系统就可以动态管理端口号了。

动态分配的端口号范围是49152 ~ 65535之间。

UDP

UDP,全称 User Datagram Protocol 。UDP 不提供复杂的控制机制,利用 IP 提供面向无连接的、不可靠的通信服务。并且它是将应用程序发来的数据,在收到的那一刻,立即按照原样发送到网络上的一种机制。

即使在网络出现拥堵的情况下,UDP 也无法进行流量控制。传输途中出现丢包,UDP 也不负责重发。当出现包的到达顺序错误时也没有纠正的功能。如果需要这些细节控制,那么需要交由上层的应用程序去处理。也可以说,是损失信息传输的可靠性来提升信息传输的效率。

UDP 的特点如下:
UDP 是无连接的:UDP 发送数据前不与对方建立连接。

UDP 不对数据进行排序:UDP 报文的头部没有数据顺序的信息。

UDP 对数据不发送确认,发送端不知道数据是否被正确接收,也不会重发数据。

UDP 传送数据比 TCP 快,系统开销也少。

UDP 缺乏拥塞控制机制,不能够检测到网络拥塞。

由于 UDP 面向无连接,它可以随时发送数据。再加上 UDP 本身的处理既简单又高效,因此常用于以下几个方面:
包总量较少的通信( DNS 、SNMP 等)
视频、音频等多媒体通信(即时通信)
只在局域网使用的应用通信
广播通信(广播、多播)

UDP知名端口号

UDP 将部分控制转移给应用程序去处理,只提供作为传输层协议的最基本功能。与 UDP 不同,TCP是对传输、发送、通信进行控制的协议。主要特点如下:
三次握手建立连接:确保连接建立的可靠性。
端口号:通过端口号识别上层协议和服务,实现网络的多路复用。
完整性校验:通过计算校验和,保证接收端能检测出传输过程中可能出现的错误。
确认机制:对于正确收到的数据,接收端通过确认应答告知发送方,超出一定时间后,发送方将重传没有被确认的段,确保传输的可靠性。
序列号:发送的数据都有唯一的序列号,标识了每一个段。接收端可以利用序列号实现丢失检测、乱序重排等功能。
窗口机制:通过可调节的窗口,TCP 接收端可以告知希望的发送速度,控制数据流量。

TCP 实现了数据传输时各种控制功能,可以进行丢包时的重发控制,还可以对次序错误的分包进行顺序控制。作为一种面向有连接的协议,只有在确定对端存在时,才会发送数据,从而可以控制通信流量的浪费。由于 UDP 没有连接控制,即使对端不存在或中途退出网络,数据包还是能够发送出去。

连接

连接是指网络中进行通信的两个应用程序,为了相互传递消息而专有的、虚拟的通信线路,也叫做虚拟电路。

一旦建立了连接,进行通信的应用程序只使用这个虚拟线路发送和接收数据,就可以保障信息的传输。应用程序可以不用考虑 IP 网络上可能发生的各种问题,依然可以转发数据。TCP 则负责连接的建立、断开、保持等管理工作。

连接

为了在不可靠的 IP 通信实现可靠性传输,需要考虑很多事情,数据的破坏、丢包、重复以及分片顺序混乱等问题。TCP 通过校验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。

序列号和确认应答

在 TCP 中,当发送端的数据到达接收主机时,接收端主机会返回一个已收到的消息。这个消息叫做确认应答( ACK )。

正常数据传输

TCP 通过确认应答实现可靠的数据传输。当发送端将数据发出后,会等待对端的确认应答。如果有确认应答,说明数据已经成功到达对端。否则,数据可能已经丢失。

在一定时间内没有等到确认应答,发送端会认为数据已经丢失,并进行重发。这样,即使有丢包,仍能保证数据到达对端,实现可靠传输。

数据丢失

未收到确认应答,不一定是数据丢失。也可能对端已经收到数据,返回的确认应答在途中丢失,也会导致发送端重发。此外,也可能确认应答延迟到达,发送端重发数据后才收到。

确认应答丢失

每一次传输数据时,TCP 都会标明段的起始序列号,以便对方确认。在 TCP 中并不直接确认收到哪些段,而是通知发送方下一次应该发送哪一个段,表示前面的段已经收到。比如:收到的确认应答序列号是 N + 1 时,表示 N 以及 N 之前的数据都收到了。

序列号和确认应答

由于每一个段都有唯一的编号,这样的话,当接收端收到重复的段时容易发现,数据段丢失后也容易定位,乱序后也可以重新排列。

超时重发

超时重发是指在重发数据之前,等待确认应答到来的那个间隔时间。如果超过RTT(往返时间),仍未收到确认应答,发送端将进行数据重发。

往返时间

数据被重发后,若还收不到确认应答,则再次发送。这时,等待确认应答的时间将会以 2 倍、4 倍的指数函数增长。数据也不会无限地重发,达到一定的重发次数后,还没收到确认应答,就会认为网络或对端主机发送异常,强制关闭连接,并通知应用通信异常强行终止。

RTT 时间是一个非常重要的参数。过大的 RTT 会导致 TCP 重传非常慢,降低传输的速度;过小的 RTT 会导致 TCP 频繁重传,降低资源的使用效率。在实际情况下,通过实时跟踪数据往返的时间间隔来动态调整 RTT 的数值。

连接管理

TCP 提供面向有连接的通信传输,面向有连接是指在数据通信前做好通信两端的准备工作。在数据通信前,发送一个SYN 包作为建立连接的请求。如果对端发来确认应答,则认为可以开始数据通信。如果对端的确认应答未能到达,就不会进行数据通信。在通信结束时,会使用FIN 包进行断开连接的处理。

SYN 包和 FIN 包是通过 TCP 头部的控制字段来管理 TCP 连接。一个连接的建立与断开,正常过程至少需要来回发送 7 个包才能完成。建立一个 TCP 连接需要发送 3 个包,这个过程叫作三次握手。断开一个 TCP 连接需要发送 4 个包,这个过程也称作四次挥手。创建一个 TCP 连接,会产生一个 32 位随机序列号,因为每一个新的连接使用一个新的随机序列号。

连接管理

三次握手

主机 A 想向主机 B 发送数据,TCP 模块通过三次握手建立连接 TCP 会话。

三次握手,是指 TCP 会话建立过程中共交换了 3 个 TCP 控制段,它们分布是 SYN 段、SYN + ACK 段、ACK 段。详细过程如下:

发送端主机 A 向接收端主机 B 发出 SYN 段,表示发起建立连接请求,同时把自己的状态告诉主机 B 。将段的序列号设为 a ,SYN 置位,表示 SYN 管理段。

主机 B 收到连接请求后,回应 SYN + ACK 段,将序列号设为 b ,确认号设为 a + 1 ,同时将 SYN 和 ACK 置位。

主机 A 收到主机 B 的连接确认后,发送 ACK 段再次进行确认,确认会话的建立,将 ACK 置位。主机 A 收到确认号是 a + 1 、序列号是 b 的段后,发送序列号为 a + 1 、确认号为 b + 1 的段进行确认。

主机 B 收到确认报文后,连接建立。双方可以开始传输数据。

三次握手

经过 3 次握手后,A 和 B 之间其实是建立了两个 TCP 会话,一个是从 A 指向 B 的 TCP 会话,另一个是从 B 指向 A 的 TCP 会话。A 发送的 SYN 段,表示 A 请求建立一个 从 A 指向 B 的 TCP 会话,目的是控制数据能够正常、可靠的从 A 传输到 B 。B 在收到 SYN 段后,会发送一个 SYN + ACK 段作为回应。SYN + ACK 的含义是:B 一方面同意了 A 的请求,另一方面也请求建立一个从 B 指向 A 的 TCP 会话,这个会话目的是控制数据能够正确、可靠的从 B 传输到 A 。A 收到 SYN + ACK 段后,回应一个 ACK ,表示同意 B 的请求。

四次挥手

当 TCP 数据段的传输结束时,双方都需要发送 FIN 段和 ACK 段来终止 TCP 会话。这个方式叫做四次挥手,详细过程如下:

主机 A 想要终止连接,发送序列号为 p 的段,FIN 置位,表示 FIN 管理段。

主机 B 收到主机 A 发送的 FIN 段后,发送 ACK 段,确认号为 p + 1 ,同时关闭连接。

主机 B 发送序列号为 q的段,FIN 置位,通知连接关闭。

主机 A 收到主机 B 发送的 FIN 段后,发送 ACK 段,确认号为 q + 1 ,同时关闭连接。TCP 连接至此结束。

四次挥手

TCP 会话的终止分为两个部分。首先 A 发送 FIN 控制段,请求终止从 A 到 B 的 TCP 会话。B 回应 ACK 段,表示同意 A 的终止会话请求。A 收到 B 的 ACK 段后,才开始终止这个会话。同理,B 也会向 A 发起请求,终止从 B 到 A 的 TCP 会话。

单位段

经过传输层协议封装后的数据称为段。在建立 TCP 连接时,可以确定数据段的大小,也就是最大消息长度( MSS )。TCP 在传输大量数据时,是以 MSS 的大小将数据进行分割发送,重发也是以 MSS 为单位。

MSS分片

MSS 是在三次握手时,由两端主机计算出来的。两端主机在发出建立连接的请求时,会在 TCP 头部写入 MSS 值。然后在两者间选择较小的值使用。MSS 默认值为 536 字节,理想值是 1460 字节,加上 IP 头部 20 字节和 TCP 头部 20字节,刚好在 IP 层不会被分片。

MSS协商

窗口控制

TCP 是以 1 个段为单位,每发一个段进行一次确认应答。如果包的往返时间越长,通信性能就越低。

为解决这个问题,TCP 引入了窗口的概念。确认应答不再是每个分段,而是以窗口的大小进行确认,转发时间被大幅度的缩短。窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值。窗口大小是一个 16 位字段,因此窗口最大是 65535 字节。在 TCP 传输过程中,双方通过交换窗口的大小来表示自己剩余的缓冲区( Buffer )空间,以及下一次能够接受的最大数据量,避免缓冲区的溢出。

滑动窗口

发送数据中,窗口内的数据即使没有收到确认应答也可以发送出去。如果窗口中的数据在传输中丢失,也需要进行重发。因此,发送端主机在收到确认应答前,必须在缓冲区保留这部分数据。

收到确认应答后,将窗口滑动到确认应答中的序列号位置。这样可以按顺序将多个段同时发送,这种机制也被称为滑动窗口控制。

滑动窗口控制

窗口控制和重发控制

在使用窗口控制时,如果出现确认应答未能返回的情况,数据已经到达对端,是不需要再进行重发的。然而在没有使用窗口控制时,没收到确认应答的数据是会重发的。而使用了窗口控制,某些确认应答即使丢失也无需重发。

窗口控制重发

如果某个报文段丢失,接收主机收到序号不连续的数据时,会为已经收到的数据返回确认应答。即使接收端收到的包序号不是连续的,也不会将数据丢弃,而是暂时保存至缓冲区。出现报文丢失时,同一个序号的确认应答将会被重复发送。如果发送端收到连续 3 次同一个确认应答,就会将对应的数据进行重发。这种机制比超时管理更高效,也被称为高速重发机制。

高速重发控制

流控制

接收端处于高负荷状态时,可能无法处理接收的数据,并丢弃数据,就会触发重发机制,导致网络流量无端浪费。

为了防止这种情况,TCP 提供一种机制可以让发送端根据接收端的实际接收能力控制发送的数据量,这就是流控制。它的具体操作是,接收端主机通知发送端主机自己可以接收数据的大小,于是发送端会发送不超过这个限度的数据。这个限度的大小就是窗口大小。

TCP 头部中有一个字段用来通知窗口大小。接收主机将缓冲区大小放入这个字段发送给接收端。当接收端的缓存不足或处理能力有限时,窗口大小的值会降低一半,从而控制数据发送量。也就是说,发送端主机会根据接收端主机的指示,对发送数据的量进行控制,也就形成了一个完整的 TCP 流控制。

若接收端要求窗口大小为0,表示接收端已经接收全部数据,或者接收端应用程序没有时间读取数据,要求暂停发送。

如果窗口更新的报文丢失,可能会导致无法继续通信。为避免这个问题,发送端主机会时不时的发送一个叫窗口探测的数据段,此数据段仅含一个字节以获取最新的窗口大小信息。

拥塞控制

有了 TCP 的窗口控制,收发主机之间不再以一个数据段为单位发送确认应答,也能够连续发送大量数据包。在网络出现拥堵时,如果突然发送一个较大量的数据,有可能会导致整个网络瘫痪。

为了防止这个问题出现,在通信开始时,就会通过一个叫慢启动的算法得出的数值,对发送数据量进行控制。

为了在发送端调节发送数据的量,需要使用拥塞窗口。在慢启动时,将拥塞窗口的大小设置为 1 MSS 发送数据,之后每收到一次确认应答( ACK ),拥塞窗口的值就加 1 。在发送数据包时,将拥塞窗口的大小与接收端主机通知的窗口大小做比较,选择它们当中较小的值发送数据。这样可以有效减少通信开始时连续发包导致网络拥堵,还可以避免网络拥塞的发生。

TCP和UDP对比

UDP 格式

UDP 段由 UDP 头部和 UDP 数据组成。UDP 头部有源端口号、目的端口号、长度、校验和组成,UDP 头部长度为固定的 8 字节。

UDP报文格式

源端口号:字段长 16 位,表示发送端 UDP 端口号。
目的端口号:字段长 16 位,表示接收端 UDP 端口号。
长度:字段长 16 位,表示 UDP 头部和 UDP 数据的总长度。
校验和:字段长 16 位,是错误检查的字段,包括 UDP 头和 UDP 数据的内容计算得出,用于检查传输过程中出现的错误。

TCP 格式

TCP 头部比 UDP 头部复杂得多,由一个 20 字节的固定长度加上可变长的选项字段组成。

TCP报文格式

源端口号:字段长 16 位,表示发送端 TCP 端口号。
目的端口号:字段长 16 位,表示接收端 TCP 端口号。
序列号:字段长 32 位,是指 TCP 段数据的位置序号。根据序列号来判断是否存在重收、漏收、乱序等情况。
确认号:字段长 32 位,是指下一次应该收到的数据的序列号。收到这个确认号,表示这个确认号之前的数据都已经正常收到。
数据偏移:字段长 4 位,表示 TCP 数据从哪一位开始计算,也可以看作 TCP 头部的长度。
保留:字段长 6 位,保留给以后扩展使用。
控制位:字段长 6 位,每 1 位标志位可以打开一个控制功能,也叫做控制位。从左到右分别是 URG、ACK、PSH、RST、SYN、FIN。

控制位

URG:标志位为 1 时,表示有需要紧急处理的数据。
ACK:标志位为 1 时,表示确认应答有效。
PSH:标志位为 1 时,表示将数据立即上传给应用程序,而不是在缓冲区排队。
RST:标志位为 1 时,表示 TCP 连接出现异常,必须强制断开连接。
SYN:标志位为 1 时,表示请求建立连接,并设置序列号的初始值。
FIN:标志位为 1 时,表示数据发送结束,请求断开 TCP 连接。
窗口:字段长 16 位,标明滑动窗口的大小,表示自己还能接收多少字节的数据。
校验和:字段长 16 位,是错误检查的字段,包括 TCP 头和 TCP 数据的内容计算得出,用于检查传输过程中出现的错误。
紧急指针:字段长 16 位,表示紧急数据的长度。当 URG 位为 1 时,这个字段才有效。
选项:字段的长度是可变的。通过添加不同的选项,实现 TCP 的一些扩展功能。
填充:如果 TCP 段的头部不是 4 字节的整数倍,就填充一些 0 ,来保证头部长度是 4 字节的整数倍。
数据:TCP 段的数据部分,不是 TCP 头部内容,字段最大是 MSS。



该文章最后由 阿炯 于 2022-03-20 18:55:21 更新,目前是第 3 版。