超详细!!传输层之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要经历三次握手四次挥手才能断开连接

  1. 三次握手流程
  • 建立主机A的连接:主机A发送SYN建立连接的数据包到主机B
  • 响应A的连接并建立主机B的连接:B发送响应A连接的数据包ACK和B的请求连接数据包SYN到A;
  • 响应B的连接:A发送响应B连接的数据包ACK到B
  1. 四次挥手流程
  • A向B发送断开连接请求FIN
  • B响应A断开连接请求,发送ACK响应包给A
  • B向A发送断开连接请求FIN
  • A响应B的断开连接请求,发送ACK响应给B
  1. 为什么不能两次握手?

如果是两次握手,最多只有连接发起方的连接请求能被确认,另一方的连接请求得不到确认

  1. 为什么四次挥手的2.3步不能合并?为什么不能三次挥手?

第2步属于系统自动响应的数据包
第三步是程序手动调用close()方法发送关闭连接的请求数据包

  1. 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协议基本概念及经典面试题的主要内容,如果未能解决你的问题,请参考以下文章

UDP TCP概论及案例

计算机网络中协议相关的问题(转)

网络层之IP协议详解

rpc概念及nfs的基本应用

DNS基本概念及操作详解----------------转载

Ajax概念及基础