网络之传输层
Transmission Control Protocol
可靠传输
1.确认机制
2.超时重传
3.拥塞控制
有了TCP的窗口控制,能够连续发生大量数据包,可能会因为其他主机之间的通信导致网络拥堵, 在网络拥堵时,如果突然发送一个较大量的数据,极有可能会导致整个网络的瘫痪, TCP为了防止这个现象的出现,在通信一开始就会通过一个叫做慢启动的算法得出的数值,对发送数据量进行控制。
慢开始、拥塞避免、快重传、快恢复
TCP的拥塞控制采用了四种算法,即 慢开始、 拥塞避免、快重传 和 快恢复。 在网络层也可以使路由器采用适当的分组丢弃策略(如主动队列管理 AQM),以减少网络拥塞的发生。
4.流量控制
滑动窗口
TCP建立连接
三次握手
三次握手的主要目的是避免历史错误连接的建立并让通信的双方确定初始序列号
# 客户端–发送带有 SYN 标志的数据包–一次握手–服务端
# 服务端–发送带有 SYN/ACK 标志的数据包–二次握手–客户端
# 客户端–发送带有带有 ACK 标志的数据包–三次握手–服务端
- 握手的目标:
1.同步 Sequence 序列号
初始序列号ISN(Initial Sequence Number)
2.交换 TCP 通讯参数
如 MSS、窗口比例因子、选择性确认、指定校验和算法
- 客户端为什么要发送最后一次的ACK?
防止异常情况:客户端”已经失效的连接请求报文”连到服务端, 即因为客户端发了两个连接请求(其中一个超时后来又被服务端收到了)
- 我的理解:通过三次握手双方都能确认对方能发送报文和收到报文
TCP连接释放
四次挥手
# 1.客户端-发送一个FIN,用来关闭客户端到服务器的数据传送
# 2.服务器-收到这个FIN,它发回一个ACK,确认序号为收到的序号加1
# 3.服务器-关闭与客户端的连接,发送一个FIN给客户端
# 4.客户端-发回ACK报文确认,并将确认序号设置为收到序号加1
为什么要四次挥手?
为什么主动关闭的一方有TIME-WAIT状态?
1.保证最后一个ACK报文能够到达。如果这个ACK丢失,对方会重传FIN+ACK
2.下一个新的连接不会出现旧的连接请求报文;在TIME-WAIT时间内本连接内所有报文都消失 (”已经失效的连接请求报文”问题)
TCP保活计时器(keepalive timer)
客户端主动建立连接,后来出现故障,不能主动关闭连接
服务器每收到一次客户端的数据,就重新设置保活计时器(通常2个小时); 如果2小时没有收到客户数据,服务端开始间隔5分钟发送探测报文,10次之后关闭连接
UDP用户数据报协议
UDP是无连接的。数据报(类似于数据包)只在数据报级别有保证。 数据报可能会无序的到达目的地,也有可能会遗失。 UDP 不支持拥塞控制。虽然不如TCP那样有保证,但UDP通常效率更高。
特点
1.基于数据报;
2.不保证不丢失,不保证顺序;
3.无状态
使用场景
UDP可以通过广播将数据报发送至子网内的所有设备。这对 DHCP 很有用,因为子网内的设备还没有分配 IP 地址,而 IP 对于 TCP 是必须的。
UDP可靠性更低但适合用在网络电话、视频聊天,流媒体和实时多人游戏上。
-
流媒体协议
-
实时游戏
-
IoT物联网
-
移动通信领域
-
QUIC协议
适用情况
以下情况使用UDP代替TCP:
- 你需要低延迟
- 相对于数据丢失更糟的是数据延迟
- 你想实现自己的错误校正方法
UDP 和 TCP 的区别?
TCP 是面向连接的协议 UDP 是无连接的协议
TCP 在发送数据前先需要建立连接,然后再发送数据 UDP 无需建立连接就可以直接发送大量数据
TCP 会按照特定顺序重新排列数据包 UDP 数据包没有固定顺序,所有数据包都相互独立
TCP 传输的速度比较慢 UDP 的传输会更快
TCP 的头部字节有 20 字节 UDP 的头部字节只需要 8 个字节
TCP 是重量级的,在发送任何用户数据之前,TCP需要三次握手建立连接。 UDP 是轻量级的。没有跟踪连接,消息排序等。
TCP 会进行错误校验,并能够进行错误恢复 UDP 也会错误检查,但会丢弃错误的数据包。
TCP 有发送确认 UDP 没有发送确认
TCP 会使用握手协议,例如 SYN,SYN-ACK,ACK 无握手协议
TCP 是可靠的,因为它可以确保将数据传送到路由器。 在 UDP 中不能保证将数据传送到目标。
如何判断远程机器上某个端口是否开启,项目中需要查看域名在本地的解析 IP ,如何操作。
telnet 10.0.250.3 80
ssh … -p
wget ip:port
什么时候用长连接,短连接?
长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。 每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多, 所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。 例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。
而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源, 而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源, 如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。 所以并发量大,但每个用户无需频繁操作情况下需用短连好。