超详细!!传输层之TCP/UDP协议基本概念及经典面试题
Posted 小猪媛不圆
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了超详细!!传输层之TCP/UDP协议基本概念及经典面试题相关的知识,希望对你有一定的参考价值。
传输层之TCP/UDP协议
1. 端口号
1.1 什么叫五元组?
在TCP/IP协议中,用源IP、源端口号、目的IP、目的端口号、协议号这样一个五元组来标识一个通信。
1.2 如何查看某个端口?
可以通过netstat -n查看
- 在Windows中:netstat -ano | finder "想要查询的端口号”
- 在Linux中:netstat -anp | grep “想要查询的端口号”
1.3 端口号范围划分
- 0-1023:知名端口号,http、ftp、ssh等这些广为使用的应用层协议,他们的端口号都是固定的
- 1024-65535:操作系统动态分配的端口号。客户端程序的端口号,就是由操作系统从这个范围划分的
1.4 认识知名端口号
- ftp服务器,使用21端口
- ssh服务器,使用22端口
- telnet服务器,使用23端口
- http服务器,使用80端口
- https服务器,使用443端口
(http和https的区别,也可以从端口号这方面说)
1.5 两个问题
1.5.1 一个进程是否可以绑定多个端口号?
可以
因为一个进程可以打开多个文件描述符,而每个文件描述符都对应一个端口号,所以一个进程可以绑定多个端口号
1.5.2 一个端口号是否可以被多个进程绑定?
不可以
ps:如果进程先绑定一个端口号,然后在fork一个子进程,这样的话就可以是实现多个进程绑定一个端口号,但是两个不同的进程绑定同一个端口号是不可以的
2. UDP协议
2.1 UDP协议格式
2.2 UDP的特点
- 无连接:在传输之前不需要建立连接,知道IP和端口号就直接传输
- 不可靠:没有确认应答和重传机制,如果发生网络故障等原因导致该段数据无法发送到对方,UDP协议也不会给应用层返回任何错误信息
- 面向数据报:不能够灵活地控制读写数据的次数和数量(应用层交给UDP多长的数据报文,UDP就照原样发送,既不会拆分也不会合并)
- 缓冲区:UDP具有接收缓冲区,没有发送缓冲区(如果缓冲区满了,再达到UDP数据就会被丢弃)
- UDP能传输的最大长度是64K(包含UDP首部),如果我们需要传输的数据超过64K,就应在应用层手动分包,多次发送,并在接收端手动拼装。
2.3 基于UDP的应用层协议
- NFS:网络文件系统
- TFTP:简单文件传输协议
- DHCP:动态主机配置协议
- BOOTP:启动协议(用于无盘设备启动)
- DNS:域名解析协议
3. TCP协议
3.1 TCP协议段格式
3.2 TCP是如何保证可靠性的?
3.2.1 确认应答
TCP将每个字节的数据都进行了编号,即为序列号。发送数据包携带序号,响应的数据包携带确认序号,意思是告诉发送者,我已经接收到了哪些数据,下一次你从哪里发
3.2.2 超时重传
如果主机A在一定的时间里(单次传输的最大时间*2),没有收到主机B发来的确认数据包,就会进行重发
丢包有如下两种情况,对于第二种情况,利用我们前面提到的序列号,就很容易做到去重的效果
3.2.3 连接管理
正常情况下,TCP要经历三次握手四次挥手才能断开连接
- 三次握手流程
- 建立主机A的连接:主机A发送SYN建立连接的数据包到主机B
- 响应A的连接并建立主机B的连接:B发送响应A连接的数据包ACK和B的请求连接数据包SYN到A;
- 响应B的连接:A发送响应B连接的数据包ACK到B
- 四次挥手流程
- A向B发送断开连接请求FIN
- B响应A断开连接请求,发送ACK响应包给A
- B向A发送断开连接请求FIN
- A响应B的断开连接请求,发送ACK响应给B
- 为什么不能两次握手?
如果是两次握手,最多只有连接发起方的连接请求能被确认,另一方的连接请求得不到确认
- 为什么四次挥手的2.3步不能合并?为什么不能三次挥手?
第2步属于系统自动响应的数据包
第三步是程序手动调用close()方法发送关闭连接的请求数据包
- TIME_WAIT要持续多久时间才可以转化为CLOSED?
TIME_WAIT要持续两倍的单次报文传输最大时间,保证重发机制结束,接收ACK响应包,才能切换到CLOSED状态
3.2.4 流量控制
TCP支持根据
接收端的处理能力
,来决定发送端的发送速度,这个机制就叫做流量控制
接收端接受呢你有限,如果发送太快,导致接收端缓存区被塞满,就会产生丢包,需要告知发送端发送数据的大小,通过窗口大小字段来设置(类似景区卖票,人多,限制卖票;人满,停止卖票。流量控制窗口:基于TCP报文中窗口大小字段来设置)
3.2.5 拥塞控制
发送端网络状况不明的情况,贸然发送大量数据包,可能会造成网络拥堵
TCP引入慢启动机制,先发送少量的数据,探探路,摸清当前的网络拥堵状况,再决定按照多大的速度传输数据
3.3 TCP是如何提高性能的?
3.3.1 滑动窗口
滑动窗口就是无需等待应答而可以发送数据的最大值
- 接收响应端:ACK的下一个序号是多少,取决于接收到的连续数据包的最大序号,也决定了发送端下一次数据包要发送的内容
- 发送端:窗口下滑的依赖条件是:接收到的ACK数据包;ACK数据包中下一个序号的最大值作为窗口滑动的起始位置
- 滑动窗口也是实现流量控制的一种机制:滑动窗口的大小意味着对方还有多大缓冲区可以用于接收数据,发送端可以根据滑动窗口的大小来确定应该发送多少数据
3.3.2 延迟应答
接收端接收到数据包后,不用马上返回ACK,而是等待一段时间,让进程有一段时间可以处理缓冲区的数据,这样返回的ACK数据包中,窗口大小的字段可以设置的更大,然后导致接收端流量控制机制产生影响,滑动窗口的大小也就可以设置的更大
3.3.3 捎带应答
有些数据包是可以合并的,如ACK自己和要发送的数据包,多次网络数据传输合并在一起,就会提高效率
4.面试常考
4.1TCP的长连接与短连接
http的长连接与短链接问题实际上就是TCP的长连接和短连接问题
- HTTP/1.0中默认使用短连接:客户端和服务端每进行一次HTTP操作,就建立一次连接,响应以后任务结束就断开连接
- HTTP/1.1默认使用长连接:当一个网页打开后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再一次访问这个服务器的时候,会继续使用这一条已经建立的连接;长连接不能永久的保存,他有一个保存时间
- 在使用长连接时,会在响应头加入 Connection-alive
4.2 TCP与UDP的区别?
- TCP是面向连接的,UDP无连接
- TCP是可靠的,UDP不可靠
- TCP只支持对点的通信;UDP支持一对一,一对多,多对一,多对多通信
- TCP是面向字节流的;UDP是面向数据报的
- TCP首部开销大,20个字节;UDP只有8个字节
- TCP可以保证传输的顺序,UDP不可以保证
4.3 UDP如何实现可靠?
- 引入序列号,保证数据顺序
- 引入确认应答,保证对端收到了数据
- 引入超时重传,如果隔一段时间没有应答,就重发数据
以上是关于超详细!!传输层之TCP/UDP协议基本概念及经典面试题的主要内容,如果未能解决你的问题,请参考以下文章