# TCP/IP 协议
# TCP/IP 四层模型
TCP/IP 协议族中有一个很重要一点就是分层管理,依次为以下四层:
- 应用层
- 传输层
- 网络层
- 数据链路层
OSI 七层模型:就是把应用层细分为:应用层、表示层、会话层,把数据链路层细分为链路层和物理层,从上到下七层依次是:
- 应用层
- 表示层
- 会话层
- 传输层
- 网络层
- 数据链路层
- 物理层
# 1. 应用层-Application Layer
应用层决定了向用户提供的应用服务时的通信活动:
- HTTP(万维网服务)
- FTP(文件传输)
- SMTP(电子邮件简单发送)
- POP3(接收电子邮件)
- SSH(安全远程登陆)
- Telnet (明文远程登录)
- DNS(名称<-> IP 地址寻找,域名系统)
# 2. 传输层-Transport Layer
每一个应用层协议一般都会使用到两个传输层协议之一
- TCP:面向连接的 Transmisson Control Protocol 传输控制协议
- UDP : 无连接的包传输 User DataProtocol 用户数据报协议
何为“四元组”?
TCP 连接由源和目标 IP 地址(来自网络层)以及源和目标端口号标识。这也称为四元组:
// 源IP地址、目的IP地址、源端口、目的端口
(src ip,dst ip,src port,dst port)
TCP 网络中,为了保障每个连接提供有保证和有序的字节传递,使用了 Sequence Number
(序列号)和 Acknowledgment Number
(确认号),即 Seq 和 Ack。
SYN = 1, ACK = 0
,表示一个连接请求报文段SYN = 1, ACK = 1
,表示一个连接响应报文段FIN = 1
,表示报文段已发送完毕,请求释放连接
# 3. 网络层-Network Layer
该层中最突出的协议是 Internet 协议(IP),因此该层也称为 IP 层。IP 的核心是两个主要功能:地址和路由。
# 4. 链路层-Link Layer
(又名数据链路层,网络接口层)
用来处理连接网络中的硬件部分,硬件上的范围均在链路层中,包含
- 操作系统
- 硬件设备驱动
- NIC(Network interface Card 网络适配器:网卡 )
- 光纤等物理可见部分
# UDP 协议
UDP 协议全称是用户数据报协议,在网络中它与 TCP 协议一样用于处理数据包,是一种无连接的协议。在 OSI 模型中,在第四层——传输层,处于 IP 协议的上一层。UDP 有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。 它有以下几个特点:
- 面向无连接
- 有单播、多播、广播的功能
- UDP 是面向报文的
- 不可靠性,不管接收端能否接收,就按量发送(无拥塞控制),适合实时视频、电话会议、直播等
- 头部开销小,传输数据报文时是很高效的(8 个字节)
# TCP 协议
TCP 协议全称是传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议,由 IETF 的 RFC 793 定义。
TCP 是面向连接的、可靠的流协议。
TCP 协议的特点:
- 面向连接,建立连接的方法是“三次握手”,这样能建立可靠的连接
- 仅支持单播传输
- 面向字节流
- 可靠传输,SYN+ACK
- 提供堵塞控制
- TCP 提供全双工通信
# 三次握手四次挥手
# 三次握手
为什么 TCP 建立连接需要三次握手,而不是两次?这是因为这是为了防止出现失效的连接请求报文段被服务端接收的情况,从而产生错误。
- 第一次握手:
建立连接。客户端发送连接请求报文段,将 SYN
位置为 1,Sequence Number
为 x
;然后,客户端进入 SYN_SEND
状态,等待服务器的确认;
- 第二次握手:
服务器收到 SYN 报文段。服务器收到客户端的 SYN 报文段,需要对这个 SYN 报文段进行确认,设置 Acknowledgment Number
为 x+1
(Sequence Number+1
);同时,自己自己还要发送 SYN 请求信息,将 SYN 位置为 1,Sequence Number
为 y;服务器端将上述所有信息放到一个报文段(即 SYN+ACK
报文段)中,一并发送给客户端,此时服务器进入 SYN_RECV
状态;
- 第三次握手:
客户端收到服务器的 SYN+ACK
报文段。然后将 Acknowledgment Number
设置为 y+1
,向服务器发送 ACK
报文段,这个报文段发送完毕以后,客户端和服务器端都进入 ESTABLISHED
状态,完成 TCP 三次握手。
# 四次挥手
- 第一次挥手
主机 1(可以使客户端,也可以是服务器端),设置Sequence Number
,向主机 2 发送一个FIN
报文段;此时,主机 1 进入FIN_WAIT_1
状态;这表示主机 1 没有数据要发送给主机 2 了;
- 第二次挥手
主机 2 收到了主机 1 发送的FIN
报文段,向主机 1 回一个ACK
报文段,Acknowledgment Number
为Sequence Number
加 1;主机 1 进入FIN_WAIT_2
状态;主机 2 告诉主机 1,我“同意”你的关闭请求;
- 第三次挥手
主机 2 向主机 1 发送FIN
报文段,请求关闭连接,同时主机 2 进入LAST_ACK
状态;
- 第四次挥手
主机 1 收到主机 2 发送的FIN
报文段,向主机 2 发送ACK
报文段,然后主机 1 进入TIME_WAIT
状态;主机 2 收到主机 1 的AC
K报文段以后,就关闭连接;此时,主机1等待
2MSL`后依然没有收到回复,则证明 Server 端已正常关闭,那好,主机 1 也可以关闭连接了。
为什么要四次挥手?TCP 是全双工的,在断开连接时两端都需要发送 FIN 和 ACK。
为什么要等待 2MSL?
MSL:报文段最大生存时间,它是任何报文段被丢弃前在网络内的最长时间。
原因有二:
- 保证 TCP 协议的全双工连接能够可靠关闭
- 保证这次连接的重复数据段从网络中消失
# TCP 流量控制和 TCP 拥塞控制
如果发送方把数据发送得过快,接收方可能会来不及接收,这就会造成数据的丢失。所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。
利用滑动窗口机制可以很方便地在 TCP 连接上实现对发送方的流量控制。
发送方维持一个拥塞窗口 cwnd ( congestion window )的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口。
发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数。
拥塞控制和流量控制的差别:
拥塞问题是一个全局性的问题,涉及到所有的主机、所有的路由器、以及与降低网络传输性能有关的所有因素。流量控制往往指的是点对点通信量的控制,是个端到端的问题。
流量控制所要做的就是控制发送端发送数据的速率,以便使接收端来得及接受。拥塞控制控制的是注入网络中的数据量。
流量窗口是接收方控制的,拥塞窗口是发送方控制的