传输层
-
socket->传输密切相,传输层负责 端到端之间的传输,只关注起点和终点。
-
源ip/源端口 -> 目的ip/目的端口
-
ip地址:是一个32位的整数。ip协议中来描述的.
端口号:区分一台主机上的那个程序。是一个16位整数(0-65535)
知名端口号:0-1023
ssh服务器:22
ftp服务器:21
telnet服务器:23
http服务器:80
https服务器:443
协议(UDP/TCP)
-
UDP
-
TCP
-
TCP的设计核心
-
可靠性:发送者能知道自己发送是否成功。
-
确认应答(ACK):
保证可靠性的核心机制,为了区分当前是应答哪个数据,需要引入序号和确认序号概念,序号是给每个字节都编了号,确认序号表示的是当前序号之前的数据都已经收到了,同时也意味着向发送端索要当前确认序号开始的数据。
-
超时重传:
也是可靠传输中最核心的机制,传输一条数据没有确认应答的时候,等待一段时间,然后重新传,重传可能会重复若干次,重传次数越多,丢包的概率越低,重传的等待时间间隔也越来越久。
-
连接管理:
三次握手建立连接,四次挥手断开连接。
三次握手建立连接
- 建立连接的意义:双方各自试探对方,确认是否适合建立连接(双方的读写数据能力)。
- 双方可以在建立连接过程中协商一些必要的数据(TCP序号的基准值)。
- 三次握手具体过程:客户端先发起一个建立连接请求(SYN同步报文段),服务器端收到SYN之后会立刻返回一个确认报文段(ACK),返回这个ACK也是一个SYN,客户端收到ACK后再回复一个ACK。
- 涉及到的重要状态:
- Listen状态,服务器端状态,表示手机开机,信号良好,随时可以有人和你建立连接。
- ESTABLISHED状态:表示别人给你打电话,你接通了,连接已经建立完成,随时可以开始通信。
四次挥手断开连接
- 1
- 涉及到的重要状态:
- CLOSE_WAIT:等待程序调用Close来完成最终的断开连接过程。如果一个服务器上出现大量的CLOSE_WAIT, 说明代码中有bug,代码里的close方法忘记调用了,或者没有执行到。
- TIME_WAIT:虽然此时程序已经结束了,但是还是要保持连接为TIME_WAIT,因为发送的最后一个ACK可能会丢包。TIME_WAIT等待时间:2MSL(MSL为成为网络上两个主机数据传输的理论最大时间,Centos7 上默认是60s)
-
-
传输效率:可靠性的前提下尽量提高传输效率。
-
滑动窗口
- 窗口:不等待ACK的情况下批量发送多少数据
- 滑动:每次收到一个ACK之后,就依次发送下一条数据,等待ACK数据区间就在往后移动。窗口越大,传输效率就越高。
- 可靠性:如果窗口无限大,那么接收端就有可能处理不过来,网络环境也可能承载不了。
- 如果在滑动窗口过程中丢包了:
- 如果是ACK丢了:没有影响,确认序号表示的含义是当前序号之前的数据都收到了,后一个ACK可以涵盖前一个ACK
- 如果是数据丢失了,接收端就会反复尝试索要该丢失的数据,重复若干次之后,发送端就会认为丢包,并重传该丢失的数据,而对于以发送成功的数据,则没必要再重新传输一遍。
- 窗口:不等待ACK的情况下批量发送多少数据
-
流量控制:
- 限制滑动窗口大小的一种机制,根据接收端的处理能力来进行限制。
- 接收缓冲区剩余空间越大,接收端处理能力越强;接收缓冲区剩余空间越小,接收端处理能力越弱;接收缓冲区
- 限制滑动窗口大小的一种机制,根据接收端的处理能力来进行限制。
-
拥塞控制:根据网络的拥堵情况,来限制发送端的发送速率
试探式的方式:刚开始的时候是用比较小的滑动窗口,如果这个时候没有丢包,说明网络比较畅通,增大滑动窗口;如果发生丢包,说明网络可能拥堵了,减小滑动窗口。
发送端真实的滑动窗口大小=min(流量控制中的窗口大小,拥塞窗口)。
-
-
CK中的滑动窗口就更大了。