TCP
在面试的时候,如果问大家,TCP 的三次握手,大家一般准备下,都会很容易的回答上这个问题。但是如果这样问:TCP 为什么要三次握手,二次行不行?你还会吗?其次,大家都知道TCP 有个特点:是可靠传输,那问题来了:TCP 是怎么保证可靠传输的?难道就因为三次握手了。
问题1: TCP 为什么要三次握手,二次行不行?
如果是2次握手,就会出现下面的情况:
1.客户端发送syn同步报文给server端时,如果因为网络环境不好,此时网络发生了超时。
2.等待一段时间后,发现没有接受到服务端的ack确认报文时,客户端会启用超时重传策略,重新syn发送报文给server。
3.这个时候服务端收到syn报文后,给客户端发送一个ack确认报文,此时,客户端和服务端建立了链接。但是当后续的某个时候,服务端收到了之前因为超时而晚到的syn报文,server端就认为又要建立一个连接。这就出现问题了。
问题2: TCP 是怎么保证可靠传输的?
TCP 是怎么保证可靠传输的?(怎么保证报文:无差错、 不丢失、 不重复、 按序到达)
可靠传输在 TCP 层面是通过【停止等待协议】实现的:
无差错情况
无差错情况下,客户端会按顺序的发送一个报文,得到 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自动化测试等,微信搜索公众号:“无量测试之道”,或扫描下方二维码:
添加关注,让我们一起共同成长!