# 内核态层-TCP层面试题.md
# 面试-TCP3次握手和4次挥手
- 面试的时候希望用专业术语说!虽然打比方能够讲清楚
# 连接时候为什么需要三次握手?
(1)通俗解释1
三次握手,就是说三次收发消息的过程。
一个完整的TCP连接,他有一个标准就是说:通讯的双方,都能确认双方是能够正常收发的!(注意,收和发)
C客户端→S服务器
S收到后,可以确认:
S就知道
- [x] C能正常发(确认)
- [ ] C能正常收
- [ ] S能正常发
- [x] S能正常收(确认)
C客户端←S服务器
S就知道
- [x] C能正常发(确认)
- [x] C能正常收(确认)
- [x] S能正常发(确认)
- [x] S能正常收(确认)
C客户端→S服务器
[x] C能正常发
[x] C能正常收(确定)
[x] S能正常发(确定)
[x] S能正常收
简介说法:三次握手目的是保证双方都有发送和接收的能力。
# 为什么断开的时候需要四次挥手?
牛客:因为tcp是全双工模式,接收到FIN时意味将没有数据再发来,但是还是可以继续发送数据,所以断开连接时必须是四次握手
百度: https://baike.baidu.com/item/tcp%E5%9B%9B%E6%AC%A1%E6%8C%A5%E6%89%8B/7922126?fr=aladdin
讲得很好: 这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。
但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的
# TCP协议真的有所谓的“粘包问题”吗?
《Linux多线程服务器编程》的说明
《Effective TCP/IP Programming (opens new window)》这本书属于专家经验总结类,初看时觉得收获很大,工作一段时间再看也能有新的发现。 比如第6条“TCP是一个字节流协议”,看过这一条就不会去研究所谓的“TCP粘包问题”。