- 传输层的主要作用是实现
应用程序
之间的的包传递。网络层主要是保证不同数据链路
的包传递,至于如何传输数据
则是由传输层负责。
传输层协议简介
-
常见的传输层协议主要有
TCP
协议和UDP
协议 -
TCP 协议是面向
有连接
的协议-
使用 TCP 协议传输数据之前一定要在发送方和接收方之间建立连接。一般情况下建立连接需要三步,关闭连接需要四步
-
建立 TCP 连接后,由于有数据重传、流量控制等功能,TCP 协议能够正确处理丢包问题,保证接收方能够收到数据,与此同时还能够有效利用网络带宽。然而 TCP 协议中定义了很多复杂的规范,因此
效率
不如 UDP 协议,不适合实时
的视频和音频传输。
-
-
UDP
协议是面向无连接
的协议- 它只会把数据传递给接收端,不会关注接收端是否真的收到了数据。
- 这种特性反而适合多播,实时的视频和音频传输。因为个别数据包的丢失并不会影响视频和音频的整体效果。
-
IP 协议中的两大关键要素是
源 IP 地址
和目标 IP 地址
。而刚刚我们说过,传输层的主要作用是实现应用程序
之间的通信。因此传输层
的协议中新增了三个要素:源端口号
,目标端口号
和协议号
。通过这五个信息,可以唯一识别一个通信。 -
端口
用于区分同一台主机上不同的应用程序
- 假设你打开了两个浏览器,浏览器 A 发出的请求不会被浏览器 B 接收,这就是因为 A 和 B 具有不同的端口。
-
协议号
用于区分使用的是TCP
还是UDP
- 因此相同两台主机上,相同的两个进程之间的通信,在分别使用 TCP 协议和 UDP 协议时也可以被正确的区分开来。
TCP的三次握手
第一次握手:
- 客户端发送
SYN包
到服务器,进入数据发送(SYN_SEND)
状态,等待服务器确认
第二次握手:
- 服务器发送
SYN+ACK(确认)包
,此时服务器进入数据接收(SYN_RECV)
状态
第三次握手:
- 客户端发送
ACK(确认)包
,客户端和服务器进入建成状态
established: 已经建立的
- 握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据
- 理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去
为什么是三次握手
-
网络不可靠,数据包可能丢失。
-
假设没有第三次确认,客户端发送了 SYN,请求建立连接。由于延迟,服务端没有及时收到这个包。于是客户端重新发送一个 SYN 包。服务端接收到了第二个 SYN 包,建立了通信,一段时间后通信结束,连接关闭。这时候第一次发送的 SYN 包抵达服务端,此时的服务端就会建立一个新的连接。然而客户端并没有请求建立连接,所以也不会向服务端发送数据。造成资源浪费
-
在三次握手的情况下,客户端会接受到一个相同的 ACK 包,这时候它会抛弃这个数据包,不会和服务端进行第三次握手,因此避免了服务端建立空的连接
-
三次握手其实解决了第二步的数据包丢失问题
ACK 确认包丢失怎么办
-
方案一:服务端会重新向客户端发送数据包,直至收到 ACK 包
- 但这种做法有可能遭到
SYN 泛洪
攻击 - 所谓的泛洪攻击,是指发送方伪造多个 IP 地址,模拟三次握手的过程。当服务器返回 ACK 后,攻击方故意不确认,从而使得服务器不断重发 ACK。由于服务器长时间处于半连接状态,最后消耗过多的 CPU 和内存资源导致死机
- 但这种做法有可能遭到
-
方案二:服务端发送
RST 报文
,进入CLOSE
状态;客户端如果还想重新建立 TCP 连接,就必须重新开始第一次握手
- 这个 RST 数据包的 TCP 首部中,控制位中的 RST 位被设置为 1。这表示连接信息全部被初始化,原有的 TCP 通信不能继续进行
TCP关闭的四次握手
服务器和客户端均可以主动发起断开TCP
连接的请求,断开过程需要经过“四次握手”
1.(客户端):我要关闭了
2.(服务端):可以
3.(服务端):我这边也要关闭了
4.(客户端):可以
关闭连接的最后一个 ACK 丢失怎么办
- 第三步之后客户端收到
FIN
包时,会设置一个计时器
。如果ACK 丢失
,那么服务端还会重发 FIN
,客户端重置计时器
- 假设在计时器失效前服务器重发的 FIN 包没有到达客户端,客户端就会进入
CLOSE
状态,从而导致服务端永远无法收到ACK 确认
,也就无法关闭连接
TCP和UDP的区别
1.TCP面向链接,UDP非面向连接
TCP的三次握手最大程度保证了,数据传输的可靠性
2.UDP数据传输速率更快
因为不必进行三次握手
建立Socket连接
- 建立
Socket
连接至少需要一对套接字:客户端Socket,服务器端Socket
。 - 套接字:源IP地址和目的IP地址以及源端口号和目的端口号的组合
网友评论