OSI(Open System Interconnect)开放系统互联参考模型-7层模型
- 1. OSI七层模型
- 1.1 基本概念
- 1.2 七层模型的划分
- 1.3 数据传输过程
- 2. TCP/IP四层模型
- 2.1 基本概念
- 2.2 四层模型的划分
- 2.3 数据传输过程
- 3. 涉及的协议及概念
- 3.1 MTU
- 1. 概念
- 2. 关于mtu取值
- 3. 修改mtu
- 3.2 ARP
- 1. 概念
- 2. 寻址流程图
- 3. 寻址流程
- 3.3 IP
- 1. 概念
- 2. 寻址流程图
- 3. IP协议首部格式(IPV4)
- 4. IP地址
- 5. 引入子网掩码
- 6. IP与ARP关系
- 3.4 TCP
- 1. 概念
- 2. 特点
- 3. TCP协议的报文格式
- 4. TCP建立连接需要`三次握手`
- 5. TCP断开连接的四次挥手
- 6. 有限状态机(TCP)
- 3.5 UDP
- 1. 特点
- 2. UDP首部格式
- 3. UDP的无连接
- 4. 传输模型
- 5. TCP VS UDP
1. OSI七层模型
1.1 基本概念
七层模型,亦称OSI(Open System Interconnection)。参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系,一般称为OSI参考模型或七层模型。
它是一个七层的、抽象的模型体,不仅包括一系列抽象的术语或概念,也包括具体的协议
。
OSI 定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层),即 ISO 开放互连系统参考模型
对等通信,为了使数据分组从源传送到目的地,源端 OSI 模型的每一层都必须与目的端的对等层进行通信,这种通信方式称为对等层通信。在每一层通信过程中,使用本层自己协议进行通信。
不论是接收端还是发送端,每个一阶层只认识对方的同一阶层数据
1.2 七层模型的划分
-
-
物理层 – 物理介质(双绞线/光纤)/比特流
实际最终信号的传输是通过物理层实现的。通过物理介质传输比特流。规定了电平、速度和电缆针脚。
常用设备有(各种物理设备)集线器、中继器、调制解调器、网线、双绞线、同轴电缆。这些都是物理层的传输介质。
-
-
-
数据链路层 – MAC地址/字节流(帧)
将比特组合成字节,再将字节组合成帧,使用链路层地址 (
以太网使用 MAC 地址
)来访问介质,并进行差错检测。MAC地址(英语:Media Access Control Address),直译为媒体存取控制位址,也称为局域网地址(LAN Address),MAC位址,以太网地址(Ethernet Address)或物理地址(Physical Address),它是一个用来确认网络设备位置的位址。在OSI模型中,第三层网络层负责IP地址,第二层数据链路层则负责MAC位址。
MAC地址用于在网络中唯一标示一个网卡
,一台设备若有一或多个网卡,则每个网卡都需要并会有一个唯一的MAC地址数据链路层又分为 2 个子层:逻辑链路控制子层(LLC)和媒体访问控制子层(MAC)。
MAC 子层处理CSMA/CD 算法、数据出错校验、成帧等; LLC 子层定义了一些字段使上次协议能共享数据链路层。 在实际使用中,LLC 子层并非必需的。
-
-
-
网络层 – ARP(address resolution protocol)/IP/路由协议(动态,静态)
本层通过IP 寻址来建立两个节点之间的连接,为源端的运输层送来的分组, 选择合适的路由和交换节点,正确无误地按照地址传送给目的端的运输层。就是通常说的IP 层。这一层就是我们经常说的 IP 协议层。
IP 协议
是 Internet 的基础
-
-
-
传输层 – TCP/UDP/端口
传输层建立了主机端到端的链接,传输层的作用是为上层协议提供端到端的可靠和透明的数据传输服务,包括处理差错控制和流量控制等问题。该层向高层屏蔽了下层数据通信的细节,使高层用户看到的只是在两个传输实体间的一条主机到主机的、可由用户控制和设定的、可靠的数据通路。我们通常说的,TCP UDP 就是在这一层。端口号既是这里的“端”。
-
-
-
会话层 – 断点校验续传,点重传/自动收发
会话层就是负责建立、管理和终止表示层实体之间的通信会话。该层的通信由不同设备中的应用程序之间的服务请求和响应组成。
-
-
-
表示层 – 不同系统之间通信编译,工作,提供公共语言
表示层提供各种用于应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另一个系统的应用层识别。如果必要,该层可提供一种标准表示形式,用于将计算机内部的多种数据格式转换成通信中采用的标准表示形式。数据压缩和加密也是表示层可提供的转换功能之一。
-
-
-
应用层 – 定义了各种应用协议规范数据格式(http、https、ftp、smtp和dns)
OSI 参考模型中最靠近用户的一层,是为计算机用户提供应用接口,也为用户直接提供各种网络服务。我们常见应用层的网络服务协议有:HTTP,HTTPS,FTP, POP3、SMTP 等。
-
以公司 A 和公司 B 的一次生意发送为例子进行讲解
- (应用层) 实际公司A 的老板就是我们所述的用户,而他要发送的商业报价单,就是应用层提供的一种网络服务,当然,老板也可以选择其他服务,比如说,发一份商业合同,发一份询价单,等等
- (表示层)由于公司A 和公司 B 是不同国家的公司,他们之间的商定统一用英语作为交流的语言,所以此时表示层(公司的文秘),就是将应用层的传递信息转翻译成英语。同时为了防止别的公司看到,公司 A 的人也会对这份报价单做一些加密的处理。这就是表示层的作用,将应用层的数据转换翻译等。
- (会话层)会话层的同事拿到表示层的同事转换后资料(会话层的同事类似公司的外联部),会话层的同事那里可能会掌握本公司与其他好多公司的联系方式,这里公司就是实际传递过程中的实体。他们要管理本公司与外界好多公司的联系会话。当接收到表示层的数据后,会话层将会建立并记录本次会话,他首先要找到公司 B 的地址信息,然后将整份资料放进信封,并写上地址和联系方式。准备将资料寄出。等到确定公司 B 接收到此份报价单后,此次会话就算结束了,外联部的同事就会终止此次会话。
- (传输层)传输层就相当于公司中的负责快递邮件收发的人,公司自己的投递员,他们负责将上一层的要寄出的资料投递到快递公司或邮局。
- (网络层) 网络层就相当于快递公司庞大的快递网络,全国不同的集散中心,比如说, 从深圳发往北京的顺丰快递(陆运为例啊,空运好像直接就飞到北京了),首先要到顺丰的深圳集散中心,从深圳集散中心再送到武汉集散中心,从武汉集散中心再寄到北京顺义集散中心。这个每个集散中心,就相当于网络中的一个 IP 节点。
- (数据链路层)相当于快递公司的快递员,负责检查和打包货物或者文件,而每个区域的对应快递公司大多只有唯一一个快递员
- (物理层)快递寄送过程中的交通工具,提供了快件载体,就相当于我们的物理层,例如汽车,火车, 飞机,船。
本例只是为了讲述整体流程,可能并不准确
1.3 数据传输过程
发送进程:
1.应用层-- [ data ]
2.传输层-- <封装> - [ TCP头部(端口)+data ]
3.网络层-- <封装> - [ IP头部(源IP,目的IP)+TCP头部(端口)+data ]
4.数据链路层-- <封装> - [ MAC头部(源MAC,目的MAC)+IP头部(源IP,目的IP)+TCP头部(端口)+data ]
5.物理层-- <转换> - [ MAC头部(源MAC,目的MAC)+IP头部(源IP,目的IP)+TCP头部(端口)+data ] 转换为 bits
(比特流)
数据传输
接收进程:
1.服务器物理层-- 解析bits
(比特流),重组,分组
2.数据链路层-- 拆分以太帧,获取到MAC地址,得到数据 [ IP头部(源IP,目的IP)+TCP头部(端口)+data ]
3.网络层–解析IP头部,得到 [ TCP头部(端口)+data ]
4.传输层–解析TCP头部,得到 [ data ]
5.应用层–解析 [ data ]
2. TCP/IP四层模型
2.1 基本概念
ISO制定的OSI参考模型的过于庞大、复杂招致了许多批评。与此对照,由技术人员自己开发的TCP/IP协议栈获得了更为广泛的应用。
TCP/IP协议栈是美国国防部高级研究计划局计算机网(Advanced Research Projects Agency Network,ARPANET)和其后继因特网使用的参考模型。ARPANET是由美国国防部(U.S.Department of Defense,DoD)赞助的研究网络。最初,它只连接了美国境内的四所大学。随后的几年中,它通过租用的电话线连接了数百所大学和政府部门。最终ARPANET发展成为全球规模最大的互连网络-因特网。最初的ARPANET于1990年永久性地关闭。
TCP/IP参考模型分为四个层次:应用层、传输层、网络层和网络接口层
。
OSI参考模型和TCP/IP四层模型 对应关系
2.2 四层模型的划分
-
- 网络接口层 – < OSI 物理层/数据链路层 > – Ethernet
负责将数字信号在物理通道(网线)中准确传输
- 网络接口层 – < OSI 物理层/数据链路层 > – Ethernet
-
- 网络层 – < OSI 网络层 > – IP/ARP(地址解析协议,通过IP查找MAC地址)
负责寻址(准确找到对方设备)的IP协议
- 网络层 – < OSI 网络层 > – IP/ARP(地址解析协议,通过IP查找MAC地址)
-
- 传输层 – < OSI 传输层 > --TCP/UDP
负责可靠传输的TCP协议、高效传输的UDP协议
- 传输层 – < OSI 传输层 > --TCP/UDP
-
- 应用层– < OSI 会话层/表示层/应用层 > --HTTP/HTTPS/FTP/SMTP
负责各种不同应用之间的协议,如浏览器的HTTP协议、电子邮件的STMP协议等。
- 应用层– < OSI 会话层/表示层/应用层 > --HTTP/HTTPS/FTP/SMTP
2.3 数据传输过程
- 发送端是由上至下,把上层来的数据在头部加上各层协议的数据(部首)再下发给下层。
- 接受端则由下而上,把从下层接受到的数据进行解密和去掉头部的部首后再发送给上层。
- 层层加密和解密后,应用层最终拿到了需要的数据。
3. 涉及的协议及概念
3.1 MTU
1. 概念
MTU(Maximum Transmission Unit最大传输单元)是在IP层下面的MAC协议中的概念,MAC协议我们可以理解为是物理层的一些协议,它位于IP协议的下层,那么在发送数据时相当于是用户数据 + 应用层协议报头(如HTTP请求报头)作为有效载荷交给传输层(如TCP协议),TCP协议再将TCP报头 + 应用层传来的数据下交给IP层,IP层再将IP协议首部 + TCP层传来的TCP报文交付给MAC帧。因此每个MAC帧其实是IP协议首部 + IP层的有效载荷
。
MAC帧是有长度限制的,所以就要求IP数据报向下交付时并不是随心所欲想发多长就发多长,如果MAC帧要求MTU为1500字节,而IP数据包总长度有2000字节,那么就需要分片,将原有的IP数据包分成两片,依次发送,对端的主机在接收后,由对端的IP层再完成组装。我们在Linux环境下可以使用ifconfig命令查看到MTU。
一般默认MTU的长度都是1500 bytes
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 #此处
inet 192.168.71.251 netmask 255.255.255.0 broadcast 192.168.71.255
inet6 fe80::91ee:ec71:657e:c5b prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:fe:97:33 txqueuelen 1000 (Ethernet)
RX packets 8839347 bytes 943675447 (899.9 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4539092 bytes 342480290 (326.6 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
2. 关于mtu取值
我们知道IP封包最大可以达到65535bytes,比MTU最大值还要大!
既然礼物(IP数据包)比盒子(MAC)还大,那怎么才能放进去呢?
答案当然是拆解IP封包咯,将一个完整的IP封包拆解成一些1500bytes范围内的数据分片,等到数据全部传输到目的主机将它组装回来就行。
按照道理说,如果MTU值可以扩大一些,那么IP封包就不需要拆解成许多过小的分片,封包与封包传输之间的等待时间也会减少,就可以增加网络带宽的使用!
为了这个目的,所以 Gigabit 的以太网络媒体才有支持 Jumbo frame 的嘛!
这个 Jumbo frame 一般都定义到 9000bytes。
那你会说,既然如此,我们的 MTU 能不能改成 9000bytes 呢?这样一来不就能够减少数据封包的拆解,以增加网络使用率吗?
是这样没错,而且你也确实可以在 Linux 系统上更改 MTU ,但是如果考虑到整个网络中并不是所有网络媒体都支持超大值MTU,所以并不建议将MTU值修改扩大。
所以将 MTU 设定为 9000 这种事情,大概仅能在内部网络的环境中作。举例来说,很多的内部集群系统 (cluster) 就将他们的内部网络环境 MTU 设定为 9000,但是对外的适配卡可还是原本的标准 1500 喔!
也就是说,不论你的网络媒体支持 MTU 到多大,你必须要考虑到你的封包需要传到目的地时, 所需要经过的所有网络媒体,然后再来决定你的 MTU 设定才行。
3. 修改mtu
Linux
- 方法1:
命令行修改,临时生效
ifconfig $[interface] mtu $[size] up
ifconfig eth0 mtu 1500 up #实例
优点:所有Linux发行版通用;
缺点:重启后失效。
- 方法2:修改配置文件,永久有效
vi /etc/sysconfig/network-scritps/ifcfg-eth0
MTU=“1500”
service network restart
windows
>netsh interface ipv4 show subinterfaces
>netsh interface ipv4 set subinterface "连接名" mtu=1500 store=persistent
3.2 ARP
1. 概念
ARP(address resolution protocol,地址解析协议)- 网络层
地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。
主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机
,并接收返回消息,以此确定目标的物理地址;
收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。
地址解析协议是建立在网络中各个主机互相信任的基础上的,局域网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等。相关协议有RARP、代理ARP。
NDP用于在IPv6中代替地址解析协议。
2. 寻址流程图
3. 寻址流程
- arp -a查看本机网卡及学习地址信息
接口: 192.168.1.106 --- 0x5
Internet 地址 物理地址 类型
192.168.1.1 d0-76-e7-b8-f7-38 动态
192.168.1.255 ff-ff-ff-ff-ff-ff 静态
224.0.0.22 01-00-5e-00-00-16 静态
224.0.0.251 01-00-5e-00-00-fb 静态
224.0.0.252 01-00-5e-00-00-fc 静态
239.255.255.250 01-00-5e-7f-ff-fa 静态
255.255.255.255 ff-ff-ff-ff-ff-ff 静态
- ping 192.168.1.103,借助(wireshark,寻址103)
通过ping 103,发现已得到响应
再次通过arp -a 查看发现已经学习到192.168.1.103信息
3.3 IP
IP(Internet Protocol)网际协议 - 网络层
1. 概念
如果想要在互联网这个共享网络中精确定位到一台主机,那么就一定需要该主机的IP地址。
- 主机是拥有IP地址,但是不能进行路由控制(Routing,意思是中转、分组数据包)
- 路由器(Router)这种设备既有IP地址,又可以进行路由控制
我们可以将接入互联网中的主机和路由器都叫做节点。
2. 寻址流程图
3. IP协议首部格式(IPV4)
首部格式:
共20个字节,160位固定内容
-
1)4位版本号(Version):用来指定IP协议的版本,IPV4的版本号就是4,如果这个IP报文是IPV4版本,那么这个字段的值就是4,用4位来标识就是0100。IPV6的版本号则是6。
-
2)4位首部长度(Internet Header Length):表明IP首部的大小,
单位是4个字节
,length * 4的字节数
,因为这一字段共4个比特位,所以这一字段最大值为<2 ^ 4 - 1>
即15,所以IP首部最大长度为15 * 4即60字节;在默认情况下,该字段被设置为5,所以默认IP首部20字节
。 -
3)8位服务类型(Type Of Service):
- 前三位表示优先度(已经弃用)
- 第4位表示最低延迟
- 第5位表示最大吞吐
- 第6位表示最大可靠性
- 第7位表示最小代价,5-7这四位互相冲突,只能选择一个。需要根据不同情况进行选择,如果是SSH/TELNET这类远端登录,那么就应该选择最低延迟,如果是FTP类型的程序,则应该选择最大吞吐量;
- 第8位是保留位,目前没有使用,必须填0。
-
4)16位总长度(Total Length):表示IP首部和后面携带的数据部分一共有多少个字节。该字段有16个bit(比特位),因此IP数据报整体最大长度为
65535
个字节。 -
5)16位标识(ID):唯一地标识主机发送的报文,如果一份IP报文在数据链路层被分片,那么每一片的该字段应该都是相同值。帮助对端主机在接收后进行分片重组。
-
6)3位标志(Flag):
- 第一位保留(保留的意思是现在不使用,未来如果需要的话再使用),必须填0;
- 第二位用来指明是否可以分片,如果为0则可以分片,如果为1则不能分片,假如一个IP报文禁止分片且长度还大于了MTU(Maximum Transmission Unit最大传输单元),则该本文只能被丢弃;
- 如果报文被分片,第三位为1表示它是分片中段的报文,即后续还有分片报文,如果第三位为0则表示这是最后一片。
-
7)13位片偏移(Fragment Offset):该字段表示分片相对于原始IP报文开始处的偏移量,其实就是表示当前分片在原报文中所处的位置,第一个分片对应值为0。由于该字段总共13个比特位,因此最多可以表示
<2 ^ 13 = 8192>
个相对位置。单位为8字节,所以最大可以表示< 8192 * 8 = 65536 >
个字节的位置。 -
8)8位生存时间(Time To Live):数据报到达目的地的最大报文跳数(Hop,指网络中一个区间,IP数据包正是在网络中一个跳间被转发),一般为
64
,每次经过一个路由,TTL–1,如果TTL == 0
时还没到达目的地,那么这个报文就会被丢弃。这个字段主要是为了防止出现路由循环,数据包在一个循环中一直转发,浪费网络资源。 -
9)8位协议(Protocol):表示IP的
上层是什么协议
,我们熟知的TCP、UDP、ICMP等都是在IP上层的。 -
10)16位首部校验和(Header Checksum):使用CRC(循环冗余校验)进行校验,鉴别IP首部是否收到损坏,如果损坏直接丢弃,它只校验IP头部,不校验下面的内容,因为内容部分的校验是上层传输层(TCP)需要考虑的,IP协议只要发现首部有问题就直接丢弃该报文。
-
11)32位源IP地址(Source Address):表示发送端的IP。
-
12)32位目的IP地址(Destination Address):表示接收端的IP。
-
13)选项字段(Options):不定长,最大可以到40个字节。
4. IP地址
- IP地址的定义:
IPV4中我们由32位正整数来表示IP地址,计算机内部会直接以二进制来保存IP地址,不过人并不善于记忆二进制整数,所以我们采用点分十进制来记录IP地址:即将32位IP地址每8位一组,分成4组,组间用<.
>进行分隔,再将每组转换为十进制。
例如:192.168.71.251
因此我们可以直接算出,在IPV4标准下最多有2 ^ 32 = 4292967296
个IP地址,但是能被人们使用的远远不足这个数字。(比如某些IP地址是有特殊作用被预留的,某些设备如路由器会占有多个IP地址)
- IP地址的组成:
IP地址由网络标识
(网络地址)和主机标识
(主机地址)两部分组成。
我们查找一个IP地址的过程就像是去某个地方旅游一样。例如,我们想要去天安门玩,不可能直接坐高铁到达天安门,我们一定是先抵达北京市(目的网络),再通过北京市内的交通抵达天安门(目的主机)。因此我们在路由选择时,应该先找到目标主机所在的局域网,再在该局域网中找到目标主机。这种方式可以快速帮我们定位到目标局域网,在局域网内搜索目标主机就比在茫茫的网络中找一台主机要快速多了。
网络号:保证互相连接的两个网段具有不同的标识。
主机号:保证在同一个网段中,两台主机具有不同的标识。
例如:局域网中包含192.168.71.251、192.168.71.252和192.168.70.43三个IP,192.168.71和192.168.70标识两个网段,即网络号,而251和252分别为不同主机的标识,即主机号。
- IP地址的划分:
IP地址划分为五个级别,分别为A类、B类、C类、D类和E类(一直没有使用过),所以目前我们所能见到的IP地址只有A、B、C、D四类。划分的依据就是IP地址从第1位到第4位的比特位。
地址类别 | IP范围 | 容纳主机 |
---|---|---|
A类地址 | 1.0.0.1-126.255.255.254 | 可用的A类网络有126个,每个网络能容纳1600多万个主机 |
B类地址 | 128.0.0.0 ~ 191.255.255.255 | 可用的B类网络有16382个,每个网络能容纳6万多个主机 |
C类地址 | 192.0.0.0 ~ 223.255.255.255 | C类网络可达209万余个,每个网络能容纳254个主机 |
D类地址 | 224.0.0.0 ~ 239.255.255.255 | 它是一个专门保留的地址。它并不指向特定的网络,目前这一类地址被用在多点广播(Multicast)中。多点广播地址用来一次寻址一组计算机,它标识共享同一协议的一组计算机。多为操作系统使用。 |
E类地址 | 240.0.0.0 ~ 247.255.255.255 | 为将来使用保留。 |
- 一些特殊的IP地址
0.0.0.0
将IP地址中的主机地址全设置为0,即该局域网的网络号,这个IP地址代表这个局域网。
192.168.0.255
将IP地址中的主机地址全设置为1,可以变成广播地址,这个广播地址可以给同一个链路中互相连接的所有主机发送数据包
127.*
的IP地址用于本地环回测试,通常是127.0.0.1,测试本机网络配置,能ping通则说明本机的IP协议安装没问题
5. 引入子网掩码
随着Internet的发展,使用前四位是否为1来分类的方案弊端开始显现:那就是很多子网的申请者都会去申请B类网络地址,因为A类根本用不完,而C类不够用。导致B类的网络地址很快就被分配完了。而申请了A类的网络又会浪费大量的IP地址,在这种情况下,人们提出了新的划分方案:CIDR(Classless Interdomain Routing无类型域间选路)
引入子网掩码来区分网络号和主机号
子网掩码也是一个32位的正整数,但结尾通常是一串0
将IP地址与子网掩码进行&操作,所得结果就是网络号
网络号和主机号的划分就与这个IP地址是A类、B类还是C类无关了
举个例子帮助理解通过子网掩码来划分网络号和主机号
十进制 | 二进制 |
---|---|
IP地址 140.252.20.68 | 1000 1100 1111 1100 0001 0100 0100 0100 |
子网掩码 255.255.255.0 | 1111 1111 1111 1111 1111 1111 0000 0000 |
按位与后的网络号 140.252.20.0 | 1000 1100 1111 1100 0001 0100 0000 0000 |
将IP地址与子网掩码进行按位与操作后得到1000 1100 1111 1100 0001 0100 0000 0000,再转化为方便人们使用的点分十进制为140.252.20.0,这就是该子网的网络号了。并且它的子网掩码末尾的8个比特位为0,这个子网可以表示2 ^ 8 = 256台主机,因此这个子网的地址范围是140.252.20.0 ~ 140.252.20.255
6. IP与ARP关系
- ARP的作用是用来获取通信对方的硬件地址,工作于网络层和链路层。
- 你要知道对方的IP地址,ARP才会去获取对应IP的硬件地址,然后进行通信。
- IP只能保证将报文发往下一跳,而不能保证将报文传输到对方。TCP的作用则是让通信双方建立连接,确认自己能和对方是能够连接的。
总结:当你发报文时,顺序是TCP->IP->ARP,TCP将应用层数据传送给IP层,IP层查路由后,如果是本局域网内,则通知ARP,让ARP获取通信对方的硬件地址,然后将报文传送给对方。
3.4 TCP
TCP(Transmission Control Protocol,传输控制协议)- 传输层
1. 概念
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议
,由IETF的RFC 793 定义。
TCP旨在适应支持多网络应用的分层协议层次结构
。 连接到不同但互连的计算机通信网络的主计算机中的成对进程,之间依靠TCP提供可靠的通信服务。TCP假设它可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上操作。
2. 特点
- 基于流的方式;
- 面向连接;(在通信之前要通过三次握手建立链接)
- 可靠的通信方式;(确保数据不会丢失)
- 在网络状况不佳的时候,尽量降低系统由于重传带来的带宽开销;(拥塞控制)
- 通信连接维护是面向通信的两个端点的,而不考虑中间网段和节点。
因为有着拥塞控制和可靠数据传输的要求,所以导致了TCP协议的传输效率相对于UDP要低,但是不会像UDP一样出现丢包现象。
3. TCP协议的报文格式
首部格式:
TCP头部有20个固定字节,选项部分长度不定,最多40个字节。
-
1)源端口和目的端口:各占
2
个字节。端口是指传输层和应用层的服务端口。传输层的分用和复用就是通过端口实现的。- 分用:在发送端,多个客户端进程公用一个传输层。
- 复用:在接收端,传输层会根据端口号分配给不同的应用进程。
-
2)序号字段:占
4
个字节。范围是< 0 -- 2^32-1 >
。因为TCP是面向字节流,所以它为每一个字节进行编号。 -
3)确认号:占
4
个字节,是期望收到下一个报文段的数据部分的第一个序号。 -
4)数据偏移:占
4
个字节。是指TCP报文段的数据开始
的部分距TCP报文段起始部分
的偏移量。 -
5)保留字段:占
6
个字节。 -
6)标识符:
-
URG:简写为U,紧急标志位,当URG置1时,表示数据包的紧急指针域有效,用来保证连接不被阻断,并督促中间设备尽快处理。
-
ACK:简写为.,确认标志位,对已接收的数据包进行确认。ACK置1,表示确认号字段才有效。此外,TCP规定,建立连接后,传输的所有报文段的ACK都需要被置1.
-
PSH:简写为P,推送标志位,当接收者收到PSH=1时,会立即把数据传输给应用程序,而不会等到缓冲区满了,再做提交。
-
RST:简写为R,重置标志位,用于连接复位、拒绝错误和非法的数据包。RST=1,表示TCP连接出现了严重的问题,必须释放重连。
-
SYN:简写为S,同步标志位,用于建立会话连接,同步序列号。
当SYN=1,ACK=0时,表示为请求连接。 当SYN=1,ACK=1时,表示为同意连接的请求应答。
-
FIN:FIN=1,简写为F,完成标志位,表示我已经没有数据要发送了,即将关闭连接,请求释放连接。
-
-
7)窗口:占
2
个字节,表示接受端的接收窗口的大小。用于实现流量控制。将接收端发送过去的窗口大小设置成发送端的发送窗口大小,从而控制了发送端的发送效率。 -
8)校验和:用于检测发送过程中是否出现错误。
-
9)紧急指针:用于标识
紧急数据
的尾部。 -
10)选项字段:MMS(最大报文长度)实际是报文段的最大数据长度。窗口扩大因子。时间戳选项。
4. TCP建立连接需要三次握手
-
第一次握手
Client进入SYN_SENT状态,发送一个SYN帧
来主动打开传输通道,该帧的SYN标志位被设置为1,同时会带上Client分配好的SN序列号,该SN是根据时间产生的一个随机值
,通常情况下每间隔4ms会加1。除此之外,SYN帧还会带一个MSS(最大报文段长度)可选项的值,表示客户端发送出去的最大数据块的长度。报文:SYN(1) + seq(client SN 随机数a) [ + MSS ]
-
第二次握手
Server端在收到SYN帧之后,会进入SYN_RCVD状态,同时返回SYN+ACK帧给Client,主要目的在于通知Client,Server端已经收到SYN消息,现在需要进行确认。Server端发出的SYN+ACK帧的ACK标志位被设置为1,其确认序号AN(Acknowledgment Number)值被设置为Client的SN+1;SYN+ACK帧的SYN标志位被设置为1,SN值为Server端生成的SN序号;SYN+ACK帧的MSS(最大报文段长度)表示的是Server端的最大数据块长度。报文:SYN(1) + ACK(1) + seq(server SN 随机数b) + AN(a+1) [ + MSS ]
-
第三次握手
Client在收到Server的第二次握手SYN+ACK确认帧之后,首先将自己的状态会从SYN_SENT变成ESTABLISHED,表示自己方向的连接通道已经建立成功,Client可以发送数据给Server端了。然后,Client发ACK帧给Server端,该ACK帧的ACK标志位被设置为1,其确认序号AN(Acknowledgment Number)值被设置为Server端的SN序列号+1。还有一种情况,Client可能会将ACK帧和第一帧要发送的数据,合并到一起发送给Server端。报文:ACK(1) + AN(b+1) [ + data(第一帧) ]
-
Server端在收到Client的ACK帧之后,会从SYN_RCVD状态会进入ESTABLISHED状态,至此,Server方向的通道连接建立成功,Server可以发送数据给Client,TCP的全双工连接建立完成。
Client和Server完成了三次握手后,双方就进入了数据传输的阶段。数据传输完成后,连接将断开,连接断开的过程需要经历四次挥手。
5. TCP断开连接的四次挥手
-
1)第一次挥手
主动断开方(可以是客户端,也可以是服务器端),向对方发送一个FIN结束请求报文,此报文的FIN位被设置为1,并且正确设置Sequence Number(SN 序列号)和Acknowledgment Number(AN 确认号)。发送完成后,主动断开方进入FIN_WAIT_1状态,这表示主动断开方没有业务数据要发送给对方,准备关闭SOCKET连接了。 -
2)第二次挥手
正常情况下,在收到了主动断开方发送的FIN断开请求报文后,被动断开方会发送一个ACK响应报文,报文的Acknowledgment Number(AN 确认号)值为断开请求报文的Sequence Number(SN 序列号)加1,该ACK确认报文的含义是:“我同意你的连接断开请求”。之后,被动断开方就进入了CLOSE-WAIT(关闭等待)状态,TCP协议服务会通知高层的应用进程,对方向本地方向的连接已经关闭,对方已经没有数据要发送了,若本地还要发送数据给对方,对方依然会接受。被动断开方的CLOSE-WAIT(关闭等待)还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
主动断开方在收到了ACK报文后,由FIN_WAIT_1转换成FIN_WAIT_2状态。
-
3)第三次挥手
在发送完成ACK报文后,被动断开方还可以继续完成业务数据的发送,待剩余数据发送完成后,或者CLOSE-WAIT(关闭等待)截止后,被动断开方会向主动断开方发送一个FIN+ACK结束响应报文,表示被动断开方的数据都发送完了,然后,被动断开方进入LAST_ACK状态。 -
4)第四次挥手
主动断开方收在到FIN+ACK断开响应报文后,还需要进行最后的确认,向被动断开方发送一个ACK确认报文,然后,自己就进入TIME_WAIT状态,等待超时后最终关闭连接。处于TIME_WAIT状态的主动断开方,在等待完成2*MSL
的时间后,如果期间没有收到其他报文,则证明对方已正常关闭,主动断开方的连接最终关闭。
被动断开方在收到主动断开方的最后的ACK报文以后,最终关闭了连接
处于TIME_WAIT状态的主动断开方,在等待完成2MSL
的时间后,才真正关闭连接通道,其等待的时间为什么是2MSL呢?
2MSL
翻译过来就是两倍的MSL。MSL全称为Maximum Segment Lifetime,指的是一个TCP报文片段在网络中最大的存活时间,具体来说,2MSL对应于一次消息的来回(一个发送和一个回复)所需的最大时间
。如果直到2MSL,主动断开方都没有再一次收到对方的报文(如FIN报文),则可以推断ACK已经被对方成功接收,此时,主动断开方将最终结束自己的TCP连接。所以,TCP的TIME_WAIT状态也称为2MSL等待状态。
有关MSL的具体的时间长度,在RFC1122协议中推荐为2分钟。在SICS(瑞典计算机科学院)开发的一个小型开源的TCP/IP协议栈——LwIP开源协议栈中MSL默认为1分钟。在源自Berkeley的TCP协议栈实现中MSL默认长度为30秒。总体来说,TIME_WAIT(2MSL)等待状态的时间长度,一般维持在1-4分钟之间。
通过三次握手建立连接和四次挥手拆除连接,一次TCP的连接建立及拆除,至少进行7次通信,可见其成本是很高的
6. 有限状态机(TCP)
有限状态自动机(FSM finite state machine 或者FSA finite state automaton )是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型
TCP的11种状态:
- CLOSED:初始时没有任何连接的状态。
- LISTEN:服务器监听来自客户端的连接请求(SYN包)。
- SYN_SENT:客户端socket执行CONNECT连接,发送SYN包,之后等待来自服务器的SYN ACK包(服务器的连接请求和对客户端连接请求的确认)。
- SYN_RCVD:服务端收到客户端的SYN包并发送服务端SYN ACK包,之后等待客户端对连接请求的确认(ACK包)。
- ESTABLISH:表示连接建立。客户端发送了最后一个ACK包后进入此状态,服务端接收到ACK包后进入此状态。
- FIN_WAIT_1:终止连接的一方(通常是客户机)发送了FIN包后进入此状态,之后等待对方FIN包。
- CLOSE_WAIT:(假设服务器)接收到客户机FIN包之后等待关闭的阶段。在接收到对方的FIN包之后,自然是需要立即回复ACK包的,表示已经知道断开请求。但是本方是否立即断开连接(发送FIN包)取决于是否还有数据需要发送给客户端,若还有数据要发送,则在发送FIN包之前均为此状态。
- FIN_WAIT_2:客户端接收到服务器的ACK包,但并没有立即接收到服务端的FIN包,进入FIN_WAIT_2状态。此时是半连接状态,即有一方要求关闭连接,等待另一方关闭。
- LAST_ACK:服务端发动最后的FIN包,等待最后的客户端ACK包。
- CLOSING:当主动关闭方处于FIN_WAIT_1时,被动关闭方的 FIN 先于之前的自己发送的 ACK 到达,主动关闭方就直接FIN_WAIT_1 -> CLOSING,(其实就相当于同时关闭),然后迟来的 ACK 到达时,主动关闭方就从CLOSING -> TIME_WAIT。
- TIME_WAIT:客户端收到服务端的FIN包,并立即发出ACK包做最后的确认,在此之后的2MSL(两倍的最长报文段寿命)时间称为-TIME_WAIT状态。
粗实线箭头表示对客户进程的正常变迁。
粗虚线箭头表示对服务器进程的正常变迁。
另一种细线箭头表示异常变迁。
参考 TCP有限状态机
正常状态变迁
服务端正常状态变迁
:
- 服务器通过listen()系统调用后进入LISTEN状态,被动等待客户端连接(被动打开)。
- 服务器一旦监听到某个连接请求(收到同步报文段SYN),就将该连接放入内核请求等待队列中,并向客户端发送SYN ACK同步确认报文段,此时服务端处于SYN_RCVD状态,等待客户端的确认。
- 服务器成功接收到客户端发送回的ACK确认报文段后,进入ESTABLISHED状态。(此时已建立连接,双方能够进行双向数据传输)
- 数据传输完毕,服务器收到客户端发送的FIN结束报文段后,给客户端发送回ACK确认报文段(服务器可能还有数据要发),此时服务端处于CLOSE_WAIT状态,服务器继续发送未发完的数据。
- 服务器在发送完数据后给客户端发送FIN结束报文段,之后进入LAST_ACK状态,等待客户端对结束报文段的最后一次确认。
- 服务器成功收到客户端发送回的ACK确认报文段后,连接彻底关闭,进入CLOSE状态。
客户端正常状态变迁
:
- 客户端通过connect()系统调用给服务器发送一个SYN同步报文段请求建立连接,此时客户端进入SYN_SENT状态。
- 客户端成功收到服务器发送回的SYN ACK同步确认报文段后,再给服务器发送一个ACK确认报文段,之后进入ESTABLISHED状态。(此时已建立连接,双方能够进行双向数据传输)
- 数据传输完毕后,客户端给服务器发送一个FIN结束报文段,之后进入FIN_WAIT_1状态,等待服务端的确认。
- 客户端收到服务器发送的ACK确认报文段后,进入FIN_WAIT_2状态,之后接收服务器发送的还未发完的数据。
- 服务器发完数据后,客户端收到服务器发送的FIN结束报文段,同时给服务端发回一个ACK确认报文段,之后进入TIME_WAIT状态。
- TIME_WAIT状态下等待2MSL时长内,如果客户端没有收到服务器重传的FIN结束报文段,则连接彻底关闭,此时进入CLOSE状态。
特殊状态变迁
-
(1)SYN_SENT状态——>CLOSE状态
connect连接的目标端口不存在(未被任何进程监听),或者该端口仍被处于TIME_WAIT状态的连接所占用,则服务器给客户端发送RST复位报文段,重新请求连接,但如果最终没能成功,则因超时而导致connect调用失败。
如果目标端口存在,但connect在超时时间内未收到服务器的确认报文段,则connect调用失败
3.5 UDP
UDP (User Datagram Protocol)用户数据报协议,提供面向事务的简单不可靠信息传送服务 - 传输层
1. 特点
-
1)UDP 是无连接的。即发送数据之前不需要建立连接(当然,发送数据结束时也没有连接可释放),因此减少了开销和发送数据之前的时延。
-
2)UDP 使用尽最大努力交付。即不保证可靠交付,因此主机不需要维护复杂的连接状态表(这里面有许多参数)。
-
3)UDP 是面向报文的。发送方的 UDP 对应用程序交下来的报文,在添加首部后就向下交付 IP 层。UDP 对应用层交下来的报文,既不合并,也不分拆,而是保留这些报文的边界。
这就是说,应用层交给 UDP 多长的报文,UDP 就照样发送,即一次发送一个报文。
在接收方的 UDP,对 IP 层交上来的 UDP 用户数据报,在去除首部后就原封不动地交付上层的应用进程。也就是说,UDP 一次交付一个完整的报文。因此,应用程序必须选择合适大小的报文。若报文太长,UDP 把它交给 IP 层后,IP 层在传送时可能要进行分片处理,这会降低 IP 层的效率。反之,若报文太短,UDP 把它交给 IP 层后,会使 IP 数据报的首部的相对长度太大,这也降低了 IP 层的效率。
-
4)UDP 没有拥塞控制。因此网络出现的拥塞不会使源主机的发送速率降低。这对某些实时应用是很重要的。很多的实时应用(如:IP电话、实时视频会议等)要求源主机以恒定的速率发送数据,并且允许在网络出现拥塞时丢失一部分数据,但却不允许数据有太大的时延。UDP 协议正好适合这种要求。
-
5)UDP 支持一对一、一对多、多对一和多对多的交互通信。
-
6)UDP的首部开销小,只有 8 个字节,比 TCP 的 20 个字节的首部要短。
虽然某些实时应用需要使用没有拥塞控制的 UDP,但当很多的源主机同时都向网络发送高速率的视频流时,网络就有可能发生拥塞,结果大家都无法正常接收。因此,不使用拥塞控制功能的 UDP 有可能会引起网络发生严重的拥塞问题。还有一些使用 UDP 的实时应用,需要对 UDP 的不可靠的传输进行适当的改进,以减少数据的丢失。在这种情况下,应用进程本身可以在不影响应用实时性的前提下,增加一些可靠性的措施,如采用前向纠错或重传已丢失的报文。
2. UDP首部格式
用户数据报 UDP 有两个部分组成:首部 + 数据部分
。首部部分很简单,只有 8 个字节,由四个字段组成,每个字段的长度都是两个字节。各字段含义如下:
-
1)源端口:源端口号。在需要对方回信时选用。不需要使用时可用 0 填充。
-
2)目的端口:目的端口号。这在终点交付报文时必须使用。
-
3)长度:UDP 用户数据报的长度,其最小值是 8(即仅有首部部分),单位:字节。
-
4)校验和:检测 UDP 用户数据报在传输过程中是否出错。有错就丢弃。
如果接收方 UDP 发现收到的报文中的目的端口号不正确(即不存在对应于该端口号的应用进程),就丢弃该报文,并由网际控制报文协议 IGMP(Internet Group Management Protocol) 发送 “端口不可达” 差错报文给发送方。
请注意,虽然 在 UDP 之间的通信要用到其端口号,但由于 UDP 之间的通信是无连接的,因此不需要使用套接字socket(TCP 之间的通信必须要在两个套接字之间建立连接)
3. UDP的无连接
套接字本身比较抽象,可以理解为操作系统为应用程序提供一组应用程序接口(API),应用程序可以通过套接字接口,来使用网络套接字,以进行数据交换。
之所以说UDP是无连接的,因为使用UDP协议的发送者和接受者之间不必存在任何长期的关系。它们没有建立连接过程,整个消息传输过程简单来说就是发送即结束
。对于发送者而言,一个UDP套接字可以向多个客户端发送消息;对于接受者而言,一个UDP套接字也可以接受多个服务器发来的消息。通信者双方并没有保持一个固定的连接,所以说UDP是无连接的。
《UNIX网络编程》中的话解释如下:
举例来说,一个UDP客户可以创建一个套接字并发送一个数据报给一个给定的服务器,然后立即用同一个套接字发送另一个数据报给另一个服务器。同样的一个UDP服务器可以用同一个UDP套接字从若干个不同的客户接收数据报,每个客户一个数据包。
参考 如何理解UDP的“无连接”特性?