《40 张图解被问千百遍的 TCP 三次握手和四次挥手面试题.docx》由会员分享,可在线阅读,更多相关《40 张图解被问千百遍的 TCP 三次握手和四次挥手面试题.docx(40页珍藏版)》请在第一文库网上搜索。
1、40张图解被问千百遍的TCP三次握手和四次挥手面试题雅(ft TCP头格式为什么需要TCP协议? TCP工作在哪一层?什么是TCP?什么是TCP连接?如何魄一确定一个TCP违报呢?TCP基本认识有一个IP的服务器监听了一个道口,它的TCP的霰大连接蚊是多少?UDP和TCP有什么区别昵?分别的应用场景是?为什么UOP头部没有首部长度J字段,而TCP头部有首部长度J字段呢?为什么UOP头部有包长度j字段,而TCP头郃则没有包长度字段呢?TCP三次塌手过程和状态变迁如何在Unux系统中资看TCP状态?为什么是三次强手?不是两次、四次?为什么每次建立TCP连接时,初始化的序列号都要求不一样呢?TCP连
2、接建立初始序列号ISN是如何随机产生的?既然沪层会分片,为什么TCP层还需要MSS呢?第一次握手丢失了,会发生什么?第二次握手丢失了.会发生什么?第三次握手丢失了,会发生什么?什么是SYN攻击?如何避免SYN攻击? TCP四次挥手过程和状态变迁!为什么挥手需要四次?第一次挥手丢失了,会发生什么?(,第二次挥手丢失了,会发生什么?第三次挥手丢失了,会发生什么?第四次挥手丢失了.会发生什么?TCP连接断开为什么TIME.WAIT等待的时间理2MSL?为什么需要TIME.WAIT状态?TIME.WAIT过多有什么危害?如何优化TIME.WAIT?如果已经建立了连接,但是客户底突然出现故蹲 了怎么办?
3、如果已经建立了连接,但是客户端的进程端债会发生什么?针对TCP应该如何Socket编程?-listen时候号敌backlog的意义?-accept发生在三次握手的牒一步?客户靛调用close 1淳拎是断开的流程是什么?PS:本次文章不涉及TCP流量控制、拥塞控制、可靠性传输等方面知识,这些知识在这篇:你还在为TCP重传、滑动窗口、流量控制、拥塞控制发愁吗?看完图解就不愁了01 TCP基本认识瞧瞧TCP头格式我们先来看看TCP头的格式,标注颜色的表示与本文关联比较大的字段,其他字段不做详细阐述。TCP头部格式;数据;IIII!;TCP头格式序列号:在建立连接时由计算机生成的随机数作为其初始值,通
4、过SYN包传给接收端主机,每发送一次数据,就累加一次该数据字节数的大小。用来解决网络包乱序问题。确认应答号:指下一次期望收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。用来解决丢包的问题。控制位:ACK:该位为1时,确认应答的字段变为有效,TCP规定除了最初建立连接时的SY包之外该位必须设置为1 。RST.该位为时,表示TCP连接中出现异常必须强制断开连接。SYN:该位为时,表示希望建立连接,并在其序列号的字段进行序列号初始值的设定。FIN:该位为时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换F
5、IN位为1的TCP段。为什么需要TCP协议? TCP工作在哪一层?IP层是不可靠的,它不保证网络包的交付、不保证网络包的按序交付、也不保证网络包中的数据的完整性。应用层应用层传输层网络层表示层会话层传输层网络层数据链路层网络接口层物理层TCP/IP分层模型型与TCP/IP的关系OSI参考模型osi参考模如果需要保障网络数据包的可靠性,那么就需要由上层(传输层)的TCP协议来负责。因为TCP是一个工作在传输层的可靠数据传输的服务,它能确保接收端接收的网络包是无损坏、无间隔、非冗余和按序的。什么是TCP ?TCP是面向连接的、可靠的、基于字节流的传输层通信协议。面向连接可靠的 字节流面向连接:一定
6、是一对一才能连接,不能像UDP协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的;可靠的:无论的网络链路中出现了怎样的链路变化,TCP都可以保证一个报文一定能够到达接收端;字节流:消息是没有边界的,所以无论我们消息有多大都可以进行传输。并且消息是有序的,当前一个消息没有收到的时候,即使它先收到了后面的字节,那么也不能扔给应用层去处理,同时对重复的报文会自动丢弃。什么是TCP连接?我们来看看RFC 793是如何定义连接的:Connections: The reliability and flow control mechanisms described aboverequire t
7、hat TCPs initialize and maintain certain status information foreach data stream. The combination of this information, including sockets,sequence numbers, and window sizes, is called a connection.简单来说就是,用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket、序列号和窗口大小称为连接。socketssequencenumberswindow sizes所以我们可以知道,建立一
8、个TCP连接是需要客户端与服务器端达成上述三个信息的共识。Socket:由TP地址和端口号组成序列号:用来解决乱序问题等窗口大小:用来做流量控制如何唯一确定一个TCP连接呢?TCP四元组可以唯一的确定一个连接,四元组包括如下:源地址源端口目的地址目的端口TCP四元组TCP四元组源地址和目的地址的字段(32位)是在IP头部中,作用是通过IP协议发送报文给对方主机。源端口和目的端口的字段(16位)是在TCP头部中,作用是告诉TCP协议应该把报文发给哪个进程。有一个IP的服务器监听了一个端口,它的TCP的最大连接数是多少?服务器通常固定在某个本地端口上监听,等待客户端的连接请求。因此,客户端IP和
9、端口是可变的,其理论值计算公式如下:最大TCP连接数二客户端的工P数X客户端的端口数对IPv4,客户端的IP数最多为2的32次方,客户端的端口数最多为2的16次方,也就是服务端单机最大TCP连接数,约为2的48次方。当然,服务端最大并发TCP连接数远不能达到理论上限,会受以下因素影响:文件描述符限制,每个TCP连接都是一个文件,如果文件描述符被占满了,会发生too many open fileso Linux对可打开的文件描述符的数量分别作了三个方面的限制:系统级:当前系统可打开的最大数量,通过cat/proc/sys/fs/f i le-max 查看;用户级:指定用户可打开的最大数量,通过c
10、at/etc/securi ty/1 imi ts. conf 查看;进程级:单个进程可打开的最大数量,通过cat/proc/sys/fs/nr open 查看;内存限制,每个TCP连接都要占用一定内存,操作系统的内存是有限的,如果内存资源被占满后,会发生OOMoUDP和TCP有什么区别呢?分别的应用场景是?UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务。UDP协议真的非常简,头部只有8个字节(64 立),UDP的头部格式如下:UDPPUDP头部格式目标和源端口:主要是告诉UDP协议应该把报文发给哪个进程。包长度:该字段保存了 UDP首部的长度跟数据的长度之和。校验和:校验和是为
11、了提供可靠的UDP首部和数据而设计,防止收到在网络传输中受损的UDP包。TCP和UDP区别:1 .连接TCP是面向连接的传输层协议,传输数据前先要建立连接。UDP是不需要连接,即刻传输数据。2 .服务对象TCP是一对一的两点服务,即一条连接只有两个端点。UDP支持一对一、一对多、多对多的交互通信3 .可靠性TCP是可靠交付数据的,数据可以无差错、不丢失、不重复、按需到达。UDP是尽最大努力交付,不保证可靠交付数据。4 .拥塞控制、流量控制TCP有拥塞控制和流量控制机制,保证数据传输的安全性。UDP则没有,即使网络非常拥堵了,也不会影响UDP的发送速率。5,首部开销TCP首部长度较长,会有一定的
12、开销,首部在没有使用选项字段时是20个字节,如果使用了选项字段则会变长的。UDP首部只有8个字节,并且是固定不变的,开销较小。6 .传输方式TCP是流式传输,没有边界,但保证顺序和可靠。UDP是一个包一个包的发送,是有边界的,但可能会丢包和乱序。7 .分片不同TCP的数据大小如果大于MSS大小,则会在传输层进行分片,目标主机收到后,也同样在传输层组装TCP数据包,如果中途丢失了一个分片,只需要传输丢失的这个分片。UDP的数据大小如果大于MTU大小,则会在IP层进行分片,目标主机收到后,在IP层组装完数据,接着再传给传输层。TCP和UDP应用场景:由于TCP是面向连接,能保证数据的可靠性交付,因
13、此经常用于:FTP文件传输;HTTP / IITTPS;由于UDP面向无连接,它可以随时发送数据,再加上UDP本身的处理既简单又高效,因此经常用于:包总量较少的通信,如DNS 、SNMP等;视频、音频等多媒体通信;广播通信;为什么UDP头部没有首部长度字段,而TCP头部有首部长度字段呢?原因是TCP有可变长的选项字段,而UDP头部长度则是不会变化的,无需多一个字段去记录UDP的首部长度。为什么UDP头部有包长度字段,而TCP头部则没有包长度字段呢?先说说TCP是如何计算负载数据长度:TCP数据的长度=IP总长度-邛首部长度-TCP首部长度其中IP总长度和IP首部长度,在IP首部格式是已知的。T
14、CP首部长度,则是在TCP首部格式已知的,所以就可以求得TCP数据的长度。大家这时就奇怪了问:“ UDP也是基于IP层的呀,那UDP的数据长度也可以通过这个公式计算呀?为何还要有包长度呢? ”这么一问,确实感觉UDP 包长度是冗余的。因为为了网络设备硬件设计和处理方便,首部长度需要是4字节的整数倍。如果去掉UDP 包长度字段,那UDP首部长度就不是4字节的整数倍了,所以小林觉得这可能是为了补全UDP首部长度是4字节的整数倍,才补充了包长度字段。02 TCP连接建立TCP三次握手过程和状态变迁TCP是面向连接的协议,所以使用TCP前必须先建立连接,而建立连接是通过三次握手来进行的。三次握手的过程如下图(PS:图中的SYS_SENT状态是SYN_SENT,偷懒就不重新画图了):CP三次握手一开始,客户端和服务端都处于CLOSED状态。先是服务端主动监听某个端口,处于 LISTEN状态第一个报文一一SYN报文客户端会随机初始化序号(cliont isn),将此序号置于TCP首部的序号字段中,同时把SYN标志位置为1 ,表示SY.报文。接着把第一个SYN报文发送给服务端,表示向服务端发起连接,该报文不包含应用层数据,之后客户端处于 SYN-SE