TCP/IP协议
本文最后更新于:8 个月前
内容包括:2种计算机网络模型、TCP与UDP协议比较、TCP连接过程分析
TCP/IP协议
一、TCP/IP 五层模型
- 应用层,HTTP、HTTPS协议
- 传输层,TCP、UDP
- 网络层,IP
- 数据链路层,MAC、ARP
- 物理层
二、OSI 七层模型
OSI(Open System Interconnect),即开放式系统互联。 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互连模型。
- 应用层,为计算机用户提供应用接口,也为用户直接提供各种网络服务,常见应用层的网络服务协议有:HTTP,HTTPS,FTP,POP3、SMTP等。
- 表示层,提供各种用于应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另一个系统的应用层识别。数据压缩和加密也是表示层可提供的转换功能之一。
- 会话层,负责建立、管理和终止表示层实体之间的通信会话。该层的通信由不同设备中的应用程序之间的服务请求和响应组成。
- 传输层,传输层建立了主机端到端的链接,传输层的作用是为上层协议提供端到端的可靠和透明的数据传输服务,包括处理差错控制和流量控制等问题。TCP、UDP协议在这一层。
- 网络层,通过IP寻址来建立两个节点之间的连接,为源端的运输层送来的分组,选择合适的路由和交换节点,正确无误地按照地址传送给目的端的运输层。IP协议在这一层。
- 数据链路层,将比特组合成字节,再将字节组合成帧,使用链路层地址 (以太网使用MAC地址)来访问介质,并进行差错检测
- 物理层,实际最终信号的传输是通过物理层实现的。通过物理介质传输比特流。规定了电平、速度和电缆针脚。
参考文章:OSI七层模型与TCP/IP五层模型 - 掘金 (juejin.cn)
三、TCP与UDP比较
TCP | UDP | |
---|---|---|
定义 | 面向连接的、可靠的、基于字节流的传输层协议 | 面向无连接的传输层协议 |
特性 | 1.面向连接,在通信之前需要3次握手建立连接 2.可靠性,有状态[1]、可控制[2] 3.面向字节流 | 无连接 无状态 基于数据包 |
[1] 有状态:TCP 会精准记录哪些数据发送了,哪些数据被对方接收了,哪些没有被接收到,而且保证数据包按序到达,不允许半点差错
[2] 可控制:当意识到丢包了或者网络环境不佳,TCP 会根据具体情况调整自己的行为,控制自己的发送速度或者重发
四、TCP连接过程
1、三次握手
第一次,客户端向服务端发送报文,确认客户端的发送能力
第二次,服务端收到客户端发送过来的报文后,返回一个报文,确认服务端的接受和发送能力
第三次,客户端在收到服务端返回的报文后,向服务端返回一条报文,确认客户端的接收能力
字段 | 含义 |
---|---|
seq (sequence,序列) | 作为序列号,在 SYN 报文中交换彼此的初始序列号 |
ACK (acknowledgement,确认) | 帮助对方确认它已收到SYN |
SYN (synchronous,同步的) | 用于启动和建立连接。它还可以帮助您在设备之间同步序列号 |
FIN | 用于终止连接 |
过程分析
- 双方一开始都处理 closed 状态,然后服务端开始 listen
- 客户端发起连接,发送SYN seq=x,自身转为 SYN-SENT 状态
- 服务端收到 SYN,向客户端发送 ACK ack=x+1 和 SYN seq=y,自身转为 SYN-RCVD 状态
- 客户端收到 服务端发出的SYN和ACK,发送ACK seq=x+1 ack=y+1 ,自身转为 established (已建立) 状态
- 服务端收到 客户端发出的ACK,自身转为 established 状态
2、四次挥手
通信的任何一方,即客户端或者服务端都可以主动释放连接。
第一次,A端向B端发送释放连接的报文
第二次,B端收到A端发送的报文,返回确认报文,A端向B端的连接被释放,这时B端仍然可以向A端发送数据
第三次,B端向A端发送断连的报文,
第四次,A端收到B的报文后,返回确认报文,B端向A端的连接被释放
过程分析
- 双端处于 established 状态,然后一端发起断开请求(以客户端发起为例),客户端发送 FIN seq=p,自身转为 FIN-WAIT-1 状态
- 服务端收到 FIN seq=p,然后发送 ACK seq=p+1,自身转为 CLOSE-WAIT 状态
- 客户端收到 ACK seq=p+1,转为 FIN-WAIT-2 状态
- 服务端发送 FIN seq=q,ACK ack=p+1,自身转为 LAST-ACK 状态
- 客户端收到 FIN seq=q,ACK ack=p+1,然后发送 ACK ack=q+1,等待2MSL 后转为 closed 状态
- 服务端收到 ACK ack=q+1 之后,转为closed状态
四次挥手 比三次握手 多出来的一次在哪
在服务端收到客户端的请求之后,没有把 ACK 和 SYN 一起发送过去;而是先发送 ACK,再发送 FIN 发起断连。这样做的原因是:因为服务端可能还在继续向客户端发送数据,如果等到数据发送完再一起发送 ACK和FIN,会产生长时间的延迟,导致客户端以为 FIN 没有送达而不断重复发送。
为什么要等待2MSL再关闭连接
MSL (Maximum Segment Lifetime,报文最大生存时间
)
如果直接关闭,当服务端还有数据包没送达的时候,客户端就会接受到无用包,造成数据混乱。
第1个MSL,确保客户端最后发送的ACK能够到达服务端
第2个MSL,确保对端没有收到ACK后重传的FIN报文可以到达
3、TCP报文头部字段
- 序列号,指的是本报文段第一个字节的序列号。作用:在 SYN 报文中交换彼此的初始序列号、保证数据包按正确的顺序组装
- 确认号,用来告知对方下一个期望接收的序列号,小于ACK的所有字节已经全部收到