4、OSI模型
4.1、OSI七层模型
4.2、七层模型功能
物理层:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输,如网线;网卡标准。
数据链路层:接收来自物理层的位流形式的数据,并封装成帧,传送到上一层,定义数据的基本格式,如何传输,如何标识,MAC
网络层:将网络地址翻译成对应的物理地址,并通过路由选择算法为分组通过通信子网选择最适当的路径,如不同设备的数据转发。
传输层:端到端传输数据的基本功能;如 TCP、UDP。
会话层:负责在网络中的两节点之间建立、维持和终止通信;如不同软件数据分发给不同软件。
表示层:处理用户信息的表示问题,数据的编码,压缩和解压缩,数据的加密和解密。
应用层:为用户的应用进程提供网络通信服务以及各种应用软件,包括 Web 应用。
说明:
在四层,既传输层数据被称作段(Segments);
三层网络层数据被称做包(Packages);
二层数据链路层时数据被称为帧(Frames);
一层物理层时数据被称为比特流(Bits)。
总结
网络七层模型是一个标准,而非实现,网络四层模型是一个实现的应用模型,网络四层模型由七层模型简化合并而来。
4.3、网络模型相关协议
1、应用层协议
- TCP对应的应用层协议
FTP :定义了文件传输协议,21 (20传输,21连接) |
---|
Telnet:它是一种用于远程登陆的端口,23 |
SMTP:定义了简单邮件传送协议,服务器开放 ,25 |
POP3:它是和SMTP对应,POP3用于接收邮件,110 |
HTTP:超文本传输协议,80 |
HTTPS:超文本安全协议,443 |
- UDP对应的应用层协议
DNS:用于域名解析服务,53 (服务器传输TCP,客户端查询服务器UDP) |
---|
SNMP:简单网络管理协议,161 |
TFTP(Trival File Transfer Protocal):简单文件传输协议,69 |
2、传输层协议
TCP: |
---|
UDP: |
3、网络层协议
ARP:地址解析协议 ,根据IP地址获取物理MAC地址 |
---|
IP:TCP/IP协议簇中的核心协议,也是TCP/IP的载体,IP提供不可靠的,无连接的数据传送服务 |
ICMP:网络控制报文协议,确认IP包是否成功达到目标地址,通知IP包丢失的原因(目标不可达、原点抑制、重定向、改变路由、时间戳) |
IGMP:组管理协议,让一个物理网络上的所有系统知道主机当前所在的多播组 |
DHCP:动态主机配置协议,自动的给子网内新增主机结点分配IP地址,避免手动管理IP |
OSPF:开放式最短路径优先, |
BGP:边界网关协议,用来连接Internet上独立系统的路由选择协议 |
4、数据链路层协议
ARP :地址解析协议 ,根据IP地址获取物理MAC地址 |
---|
RARP:反向地址转换协议,根据物理MAC地址获取IP地址 |
PPP:点对点协议,主要是用来通过拨号或专线方式建立点对点连接发送数据,使其成为各种主 |
5、TCP
5.1、TCP/UDP基本认识
TCP是面向连接的(一对一)、可靠的、基于字节流的传输层通信协议。
TCP连接:用于保证可靠性和流量控制维护的某些状态信息,包括Socket(IP+port)、序列号(解决乱序)和窗口大小(流量控制)
-
⾯向连接:⼀定是「⼀对⼀」才能连接,不能像 UDP 协议可以⼀个主机同时向多个主机发送消息,也就是⼀对多是⽆法做到的;
-
可靠的:⽆论的⽹络链路中出现了怎样的链路变化,TCP 都可以保证⼀个报⽂⼀定能够到达接收端;
-
字节流:消息是「没有边界」的,所以⽆论我们消息有多⼤都可以进⾏传输。并且消息是「有序的」,当「前⼀个」消息没有收到的时候,即使它先收到了后⾯的字节,那么也不能扔给应⽤层去处理,同时对「重复」的报⽂会⾃动丢弃。
UDP是不可靠、基于报文的、可实现多个连接的传输层通信协议。
5.2、TCP/UDP报头格式
1、TCP报头格式
**Seq序列号:**在建⽴连接时由计算机⽣成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送⼀次数据,就「累加」⼀次该「数据字节数」的⼤⼩。⽤来解决⽹络包乱序问题。
**Ack确认应答号:**指下⼀次「期望」收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。⽤来解决不丢包的问题。
窗口大小:(window size)滑动窗口,用于告知对方(发送方)本方的缓冲还能接收多少字节数据,主要进行流量控制。
校验和:接收端用CRC检验整个报文段有无损坏。
标志位:
- ACK:该位为 1 时,「确认应答」的字段变为有效,TCP 规定除了最初建⽴连接时的 SYN 包之外该位必须设置为 1 。
- RST:该位为 1 时,表示 TCP 连接中出现异常必须强制断开连接。
- SYN:该位为 1 时,表示希望建⽴连接,并在其「序列号」的字段进⾏序列号初始值的设定(连接报文段)。
- FIN:该位为 1 时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双⽅的主机之间就可以相互交换 FIN 位为 1 的 TCP 段。
- PSH:提示接收端立刻从缓冲读走数据。
- RST:表示要求对方重新建立连接(复位报文段)。
2、UDP报头格式
⽬标和源端⼝:主要是告诉 UDP 协议应该把报⽂发给哪个进程。
包⻓度:该字段保存了 UDP ⾸部的⻓度跟数据的⻓度之和。
校验和:校验和是为了提供可靠的 UDP ⾸部和数据⽽设计。
3、IP报头格式
5.3、TCP和UDP区别
1)连接
TCP 是⾯向连接的传输层协议,传输数据前先要建⽴连接。
UDP 是不需要连接,即刻传输数据。
2)服务对象
TCP 是⼀对⼀的两点服务,即⼀条连接只有两个端点。
UDP ⽀持⼀对⼀、⼀对多、多对多的交互通信
3)可靠性
TCP 是可靠交付数据的,数据可以⽆差错、不丢失、不᯿复、按需到达。
UDP 是尽最⼤努⼒交付,不保证可靠交付数据。
4)拥塞控制、流量控制
TCP 有拥塞控制和流量控制机制,保证数据传输的安全性。UDP 则没有,即使⽹络⾮常拥堵了,也不会影响 UDP 的发送速率。
5)⾸部开销
TCP ⾸部⻓度较⻓,会有⼀定的开销,⾸部在没有使⽤「选项」字段时是 20 个字节,如果使⽤了「选项」字段则会变⻓的。
UDP ⾸部只有 8 个字节,并且是固定不变的,开销较⼩。
6)传输⽅式
TCP 是流式传输,没有边界,但保证顺序和可靠。
UDP 是⼀个包⼀个包的发送,是有边界的,但可能会丢包和乱序。
7)分片不同
TCP 的数据⼤⼩如果⼤于 MSS ⼤⼩,则会在传输层进⾏分⽚,⽬标主机收到后,也同样在传输层组装 TCP数据包,如果中途丢失了⼀个分⽚,只需要传输丢失的这个分⽚。
UDP 的数据⼤⼩如果⼤于 MTU ⼤⼩,则会在 IP 层进⾏分⽚,⽬标主机收到后,在 IP 层组装完数据,接着再传给传输层,但是如果中途丢了⼀个分⽚,在实现可靠传输的 UDP 时则就需要重传所有的数据包,这样传输效率⾮常差,所以通常 UDP 的报⽂应该⼩于 MTU。
问题一:为什么 UDP 头部没有「⾸部⻓度」字段,⽽ TCP 头部有「⾸部⻓度」字段呢?
TCP 有可变⻓的「选项」字段,⽽ UDP 头部⻓度则是不会变化的,⽆需多⼀个字段去记录 UDP 的⾸部⻓度
问题二:为什么 UDP 头部有「包⻓度」字段,⽽ TCP 头部则没有「包⻓度」字段呢?
TCP数据长度 = IP总长度 - IP首部长度 - TCP首部长度,因此TCP数据长度是可以计算出来的。虽然UDP头部有包长度字段看起来有点冗余,但是它主要是为了网络硬件设备的设计和处理的方便,首部长度需要是4bity的整数倍。所以,包长度有可能是为了补全UDP首部长度是4bity的整数倍。
问题三:UDP和TCP数据包最大值的确定?
MTU最大传输单元,这个传输单元实际上和数据链路层有密切的关系,由于以太网传输方面的限制,每个以太网帧有最小64bytes和最大1518bytes,超过大小限制(过大或者过小的)都视为错误的数据帧,那以太网转发设备就会丢弃这些数据帧。以太网最大的数据帧是1518bytes,所以刨去以太网的帧头14bytes和帧尾4bytes,剩下1500bytes就是MTU。
- UDP包的大小为:1500 - IP头(20)- UDP头(8) = 1472
- TCP包的大小为:1500 - IP头(20)- TCP头(20) = 1460
5.4、TCP 和 UDP 应用场景:
由于 TCP 是⾯向连接,能保证数据的可靠性交付,因此经常⽤于:
-
FTP ⽂件传输
-
HTTP / HTTPS
由于 UDP ⾯向⽆连接,它可以随时发送数据,再加上UDP本身的处理既简单⼜⾼效,因此经常⽤于:
-
包总量较少的通信,如 DNS 、 SNMP 等
-
视频、⾳频等多媒体通信
-
⼴播通信
5.5、如何唯一确定一个TCP连接?
TCP是四元组(IP+port)
5.6、TCP最大连接数?
一般服务器固定在某个本地端口上监听,等待客户端的链接请求,因此客户端IP和port可变的。
理论上:max(TCP连接数) = 客户端IP * 客户端port
对 IPv4,客户端的 IP 数最多为 2 的 32 次⽅,客户端的端⼝数最多为 2 的 16 次⽅,也就是服务端单机最⼤ TCP 连接数,约为 2 的 48 次⽅。当然,服务端最⼤并发 TCP 连接数远不能达到理论上限。⾸先主要是⽂件描述符限制,Socket 都是⽂件,所以⾸先要通过 ulimit 配置⽂件描述符的数⽬;另⼀个是内存限制,每个 TCP 连接都要占⽤⼀定内存,操作系统的内存是有限的
- ⽂件描述符:Socket 实际上是⼀个⽂件,也就会对应⼀个⽂件描述符。在 Linux 下,单个进程打开的⽂件描述符数是有限制的,没有经过修改的值⼀般都是 1024,不过我们可以通过 ulimit 增⼤⽂件描述符的数⽬;
- 系统内存:每个 TCP 连接在内核中都有对应的数据结构,意味着每个连接都是会占⽤⼀定内存的;
6、TCP三次握手
6.1、TCP三次握手
三次握手(Three-way Handshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。实质上其实就是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换 TCP窗口大小 信息。
重点
TCP连接:用于保证可靠性和流量控制维护的某些状态信息,包括Socket(IP+port)、序列号(解决乱序)和窗口大小(流量控制)
6.2、为什么要三次握手才能初始化Socket、序列号和窗口大小并建立TCP连接?
三次握手的原因(三方面):