TCP

在面试的时候,如果问大家,TCP 的三次握手,大家一般准备下,都会很容易的回答上这个问题。但是如果这样问:TCP 为什么要三次握手,二次行不行?你还会吗?其次,大家都知道TCP 有个特点:是可靠传输,那问题来了:TCP 是怎么保证可靠传输的?难道就因为三次握手了。

 

问题1: TCP 为什么要三次握手,二次行不行?

网络层—简单的面试问题_客户端

如果是2次握手,就会出现下面的情况:

1.客户端发送syn同步报文给server端时,如果因为网络环境不好,此时网络发生了超时。
2.等待一段时间后,发现没有接受到服务端的ack确认报文时,客户端会启用超时重传策略,重新syn发送报文给server。
3.这个时候服务端收到syn报文后,给客户端发送一个ack确认报文,此时,客户端和服务端建立了链接。但是当后续的某个时候,服务端收到了之前因为超时而晚到的syn报文,server端就认为又要建立一个连接。这就出现问题了。

 

问题2: TCP 是怎么保证可靠传输的?

TCP 是怎么保证可靠传输的?(怎么保证报文:无差错、 不丢失、 不重复、 按序到达)

可靠传输在 TCP 层面是通过【停止等待协议】实现的:

网络层—简单的面试问题_三次握手_02

 

无差错情况

无差错情况下,客户端会按顺序的发送一个报文,得到 server 端响应后发送下一个报文。

  • 客户端发送分组报文M1, server 端给客户端确认。

  • 客户端发送分组报文M2, server 端给客户端确认。

  • 客户端发送分组报文M3, server 端给客户端确认。

 

超时重传

如果因为网络等情况,在一定时间内,客户端没有收到 server 端的反馈:
客户端再次发送报文;

 

确认丢失

如果因为网络等情况,在一定时间内,客户端没有收到 server 端的反馈:
客户端再次发送报文;

  • 是 server 端没有发送成功导致客户端没有收到反馈;

  • server 端会收到重复的M1报文,丢掉新收到的报文,给客户端回复;

 

确认迟到

如果因为网络等情况,在一定时间内,客户端没有收到 server 端的反馈:
客户端再次发送报文;

  • 如果是 server 端在规定时间内没有发给客户端反馈;

  • server 端收到重复的M1报文后,丢掉新收到的报文,给客户端回复;

  • 客户端多次收到 server 端反馈,客户端只处理收到的第一次,后面几次就不做响应了。

 

还有一些问题?

比如:

  • TCP 是面向字节流的还是面向报文的?

  • TCP 和 UDP 的区别?希望答的深入一点。 

  • get 和 post 请求方法的区别?【如果回答 get 的请求参数是拼接在url后面,post是放在方法体里面的,这是非常简单的,需要回答专业和深刻点,按照语义来,(安全、幂等、可缓存的)】

今天的分享就到这里了,最近在整理这些面试题的时候,发现知道表面的还是非常不够的,需要理解深入,知道其底层的运行机制。

欢迎关注【无量测试之道】公众号,
Python编程学习资源干货、
Python+Appium框架APP的UI自动化、
Python+Selenium框架Web的UI自动化、
Python+Unittest框架API自动化、


文章下方有公众号二维码,可直接微信扫一扫关注即可。

备注:我的个人公众号已正式开通,致力于测试技术的分享,包含:大数据测试、功能测试,测试开发,API接口自动化、测试运维、UI自动化测试等,微信搜索公众号:“无量测试之道”,或扫描下方二维码:

网络层—简单的面试问题_python_03

 添加关注,让我们一起共同成长!