每日一句英语学习,每天进步一点点:
前言
不管面试Java、C/C++、Python等开发岗位,TCP的知识点可以说是的必问的了。
任TCP虐我千百遍,我仍待TCP如初恋。
遥想小林当年校招时常因TCP面试题被刷,真是又爱又狠….
过去不会没关系,今天就让我们来消除这份恐惧,微笑着勇敢的面对它吧!
所以小林整理了关于TCP三次握手和四次挥手的面试题型,跟大家一起探讨探讨。
TCP基本认识
1.TCP连接建立
2.TCP连接断开
3.Socket编程
PS:本次文章不涉及TCP流量控制、拥塞控制、可靠性传输等方面知识,这些留在下篇哈!
正文
01TCP基本认识
瞧瞧TCP头格式
我们先来看看TCP头的格式,标注颜色的表示与本文关联比较大的字段,其他字段不做详细阐述。
TCP头格式
序列号:在建立连接时由计算机生成的随机数作为其初始值,通过SYN包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。
确认应答号:指下一次「期望」收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。用来解决不丢包的问题。
控制位:
ACK:该位为1时,「确认应答」的字段变为有效,TCP规定除了最初建立连接时的SYN包之外该位必须设置为1。RST:该位为1时,表示TCP连接中出现异常必须强制断开连接。SYC:该位为1时,表示希望建立连,并在其「序列号」的字段进行序列号初始值的设定。FIN:该位为1时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换FIN位置为1的TCP段。
为什么需要TCP协议?TCP工作在哪一层?
IP层是「不可靠」的,它不保证网络包的交付、不保证网络包的按序交付、也不保证网络包中的数据的完整性。
OSI参考模型与TCP/IP的关系
如果需要保障网络数据包的可靠性,那么就需要由上层(传输层)的TCP协议来负责。
因为TCP是一个工作在传输层的可靠数据传输的服务,它能确保接收端接收的网络包是无损坏、无间隔、非冗余和按序的。
什么是TCP?
TCP是面向连接的、可靠的、基于字节流的传输层通信协议。
面向连接:一定是「一对一」才能连接,不能像UDP协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的;可靠的:无论的网络链路中出现了怎样的链路变化,TCP都可以保证一个报文一定能够到达接收端;字节流:消息是「没有边界」的,所以无论我们消息有多大都可以进行传输。并且消息是「有序的」,当「前一个」消息没有收到的时候,即使它先收到了后面的字节已经收到,那么也不能扔给应用层去处理,同时对「重复」的报文会自动丢弃。
什么是TCP连接?
我们来看看RFC是如何定义「连接」的:
Connections:ThereliabilityandflowcontrolmechanismsdescribedaboverequirethatTCPsinitializeandmaintaincertainstatusinformationforeachdatastream.The