目录
传输层:负责数据能够从发送端传输到接收端
1. 再谈端口号
端口号(Port)标识了一个主机上进行通信的不同的应用程序
1.1 五元组:
在TCP/IP协议中,用“源IP”,“源端口号”,“目的IP”,“目的端口号”,“协议号”这“五元组”来标识一个通信(可以通过netstat-n 查看)
协议:网络数据传输时,经过的网络节点约定的规则,最终体现为数据格式
IP:在网络层IP协议中包含ip地址这个字段,体现为起点和终点,用来绑定主机
port:主机中的进程
1.2 端口号范围划分
- 0-1023:知名端口号,HTTP,FTP,SSH等这些广为使用的应用层协议,他们的端口号都是固定的;
- 1024-65535:操作系统动态分配的端口号,客户端程序的端口号,就是由操作系统从这个范围分配的。
1.3 认识知名的端口号:
有些服务器是非常常用的,为了使用方便,人们约定一些常用的服务器,都是用以下这些固定的端口号:
- ssh服务器,使用22端口
- ftp服务器,使用21端口
- telnet服务器,使用23端口
- http服务器,使用80端口
- https服务器,使用443端口
我们自己写一个程序使用端口号时,要避开这些知名端口号
1.4 常见问题:
- 一个进程是否可以绑定多个端口号?
可以
- 一个端口号是否可以被多个进程绑定?
不可以
端口号是对应进程的
2. UDP协议
UDP传输过程类似于寄信
2.1 UDP协议端格式
- 16位UDP长度,表示整个数据报(UDP首部+UDP数据)的最大长度
- 如果校验和出错,就会直接丢弃
校验和:类似文件的md5,sha1值作为校验码,通过一个算法,计算二进制数据,算出一个校验码,类似java对象中的hashcode,标识唯一
2.2 常见问题
- UDP和TCP的区别?(把UDP,TCP的特点对比并说明:UDP的特性+效率比TCP更高)
答:UDP的特性:
(1)无连接,不可靠(要保持连接,意味双方保持一个连接状态)
(2)面向数据报(发送和接收,都只能一次完成)
(3)有接收缓冲区,没有发送缓冲区(发送方不关心对方是否接收到,接收方可以接收多个UDP数据)
(4)发送数据大小受限(最多64K因为协议首部长度为16位)
- 如何用UDP传输超过64K的数据?
答:需要在应用层手动分包,多次发送,并在接收端手动拼接
- 如何用UDP来实现可靠传输?
答:在应用层,应用程序中(自己的代码)实现类似TCP的机制,可靠,大小不限
3. TCP协议
TCP全称为“传输控制协议”,即要对传输的数据进行一个详细的控制
3.1 TCP设计原则
网络数据传输,在保证安全的前提下,尽可能的提高传输效率
- 安全越高,效率越低
- 安全越低,效率越高 =>UDP效率比TCP高
3.2 TCP数据格式
常用标志位:
ACK:确认序号是否有效
SYN:请求建立连接,我们把携带SYN标识的称为同步报文段
FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段
3.3 TCP的安全机制
1. 确认应答机制
2.超时重传机制
背景:基于确认应答机制,还不满足(没有收到应答,不能一直无限期的等待)
没有应答有两种可能:1.发送的数据丢包;2.应答的数据丢包
具体实现:在一定的时间范围内,如果没有接收到应答数据报,就需要重新发送
超时时间:受网络宽带等环境因素影响,带宽越大,传输越快,超时时间就可以小一些
- 如何确定超时时间是多少?
答:TCP为了保证无论在任何环境下都能比较高性能的通信,因此会动态计算这个最大超时时间:一个底数时长,每次重发,在底数的基础上*2(2的指数方),达到一定的重传次数,意味着对方可能无法接收,需要关闭连接。
3.连接管理机制
在正常情况下,TCP要经过三次握手建立连接,四次挥手断开连接
申请建立到返回ACK确认应答才表示连接成功
- 三次握手的流程(建立连接)
(1)客户端发送SYN(建立连接的标志位)+SEQ_NO(序号)到服务端
- 这里的SYN是客户端到服务端的连接
(2)服务端响应SYN,ACK(应答第一个步骤的SYN),SEQ_NO+1(确认序号)到客户端
- 这里的SYN是服务端到客户端的连接
客户端接收到响应,建立客户端到服务端的连接(客户端保存这个连接状态)
(3)客户端再响应ACK到服务端,服务端接收到以后,建立服务端到客户端的连接(服务端保存这个连接状态)
连接的建立(保持连接的状态)是有方向的
- 四次挥手的流程(关闭连接)
(1)客户端发送FIN到服务端,申请关闭连接,服务端状态设置为CLOSE_WAIT
- 客户端到服务端的连接状态
(2)服务端响应ACK
(3)服务端发送FIN到客户端,申请关闭连接,客户端接收到,状态设置为TIME_WAIT
- 服务端到客户端的连接状态
(4)客户端响应ACK,服务端接收到以后,服务端关闭连接
常见问题:
(1)第三步客户端没有直接设置为CLOSED关闭连接?
答:第四步的ACK可能丢包,所以需要等待(超时重传时间)
[TIME_WAIT->CLOSED]客户端要等待一个2MSL(Max Segment Life,报文最大生存时间)的时间,才会进入CLOSED状态
(2)为什么第二步和第三步,没有像建立连接时一样合并数据包?
答:第二步是系统对TCP协议实现时,接收FIN,自动返回ACK,不用执行程序代码
第三步是程序手动调用执行(服务端关闭连接前,需要执行一些前置工作)
(3)当服务器上出现大量CLOSE_WAIT状态时?
就是因为服务器没有正确的关闭socket,导致四次挥手没有正确完成,这是一个BUG,只需要加上对应的close即可解决问题。
4.流量控制
接收端处理数据的速度是有限的,如果发送端发的太快,导致接收端的缓冲区被打满,这个时候如果发送端继续发送,就会造成丢包,继而引起丢包重传等一系列连锁反应,因此TCP支持根据接收端的处理能力,来决定发送端的发送速度,这个机制就叫做流量控制。
- 接收端将自己可以接收的缓冲区大小放入 TCP 首部中的 "窗口大小" (标识接收端缓冲区剩余空间大小)字段, 通过ACK端通知发送端;
- 窗口大小字段越大, 说明网络的吞吐量越高;
- 接收端一旦发现自己的缓冲区快满了, 就会将窗口大小设置成一个更小的值通知给发送端;
- 发送端接受到这个窗口之后, 就会减慢自己的发送速度;
- 如果接收端缓冲区满了, 就会将窗口置为0,这时发送方不再发送数据, 但是需要定期发送一个
窗口探测数据段, 使接收端把窗口大小告诉发送端。
4.拥塞控制
作用:发送端不清楚网络状态(是否存在网络拥堵)时,先探探路,再决定发送数据的速度
拥塞窗口:窗口大小,标识发送端网络状态。刚开始拥塞窗口大小为1,先慢后快(2的指数曲线)的增长方式变大,到达阈值后,变为线性增长,最终达到网络拥塞后,窗口大小重置为1,重复进行。