写在前面 本文转载了一篇计算机网络的面经,计算机网络相关知识此前从未接触过,希望通过实际面试问题整理出一份计算机网络原理相关知识点,突击面试。
计算机网络
三次握手和四次挥手
四次挥手为什么要有 close_wait 状态
tcp 长时间不断开连接会不会断连
tcp 超时重传机制
tcp 如何保证可靠传输
TCP 和 UDP 的区别
TCP 报文长度字段设置在哪里
哪些协议是 TCP 的,哪些是 UDP 的
UDP 怎么实现可靠传输
HTTP 请求报文结构
http 和 https 的区别
怎么解决粘包问题
拥塞控制
流量控制
拥塞控制和流量控制的区别
如何判断网络拥塞
GET 和 POST 的区别
cookie 和 session 区别
DNS 的原理
数据结构
作者:陈乐乐
链接:https://leetcode-cn.com/circle/discuss/h3upVc/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
tcp系统的理论知识速记可以参考链接:https://tyler-zx.blog.csdn.net/article/details/100176632。
tcp(transmission control protocol)传输控制协议,是一种是一种面向连接的、可靠的、基于字节流的传输层通信协议。
第一次握手:
(1) 客户端的TCP首先向服务器端的TCP发送一个特殊的TCP报文,该报文中不包含应用层数据。但是在报文的首部中的一个标志位(SYN比特)被置为1,因此,这个特殊报文被 称为 SYN报文。
(2)客户端会随机选择一个初始序号(client_isn),并将此编号放置于该起始的TCP SYN报文段的序号字段中。
(3)该报文段会被封装在一个IP数据报中,并发送给客户端服务器。
第二次握手:
(1)当服务器收到包含TCP SYN 报文段的IP数据包时,服务器会从该数据报中提取出TCP SYN报文段,为该TCP连接分配TCP缓存和变量,并向客户端TCP发送允许连接的报文段。
(2)这个允许连接的报文段也不包含应用层数据,但是在报文段的首部包含了3个重要信息,首先SYN比特为置为1,其次该TCP报文段首部的信号(client_isn)被置为(client_isn+1),最后服务器选择自己的初始序号(server_isn),并将其放到TCP报文段首部的序号字段中。允许连接的报文段有时被称为SYNACK。
第三次握手:
(1)在收到SYNACK后,客户端也要该连接分配缓存和变量,客户主机向服务器发送另外一段报文,对服务器的允许连接的报文段进行确认。
(2)客户端在发送报文时将(server_isn+1)放置到TCP报文段首部的确认字段中完成此项工作,因为已经建立了连接,此时SYN被置为0。
注:在完成三次握手的第三次之前分配这些缓存和变量,使得TCP易于收到SYN洪泛的拒绝服务器攻击,详情见:http://www.cnblogs.com/xyzyj/p/7345701.html。
主要为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。不采用三次握手的话,只要服务端发出确认,就建立新的连接了,此时客户端不理睬服务器的确认且不发送数据,则服务器一致等待客户端发送数据,会浪费资源。
服务器端的资源分配是在二次握手时分配的,而客户端的资源是在完成三次握手时分配的,所以服务器容易受到SYN洪泛攻击,SYN攻击就是客户端 在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server则回复确认包,并等待Client确认,由于源地址不存在,因此Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪。
防范SYN攻击措施:降低主机的等待时间使主机尽快的释放半连接的占用,短时间受到某IP的重复SYN则丢弃后续请求。
数据传输结束后,通信的双方都可释放连接,A和B都处于ESTABLISHED状态。
1)客户端的应用进程先向其TCP发出连接释放报文段(FIN=1,序号seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN-WAIT-1(终止等待1)状态,等待服务器的确认。
2)服务器收到连接释放报文段后即发出确认报文段,(ACK=1,确认号ack=u+1,序号seq=v),服务器进入CLOSE-WAIT(关闭等待)状态,此时的TCP处于半关闭状态,客户端到服务器的连接释放。
3)客户端收到服务器的确认后,进入FIN-WAIT-2(终止等待2)状态,等待服务器发出的连接释放报文段。
4)服务器如果有数据要继续发送,则发送。若果没有要向客户端发出的数据,服务器发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),服务器进入LAST-ACK(最后确认)状态,等待客户端的确认。
5)客户端收到服务端的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),A进入TIME-WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,客户端才进入CLOSED状态。
因为客户端在接受到释放连接请求后,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
Client与server完成一次读写之后,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接。Client与server之间的连接如果一直不关闭的话,会存在一个问 题,随着客户端连接越来越多,server早晚有扛不住的时候,这时候server端需要采取一些策略:
如关闭一些长时间没有读写事件发生的连接,这样可 以避免一些恶意连接导致server端服务受损;
如果条件再允许就可以以客户端机器为颗粒度,限制每个客户端的最大长连接数,这样可以完全避免某个蛋疼的 客户端连累后端服务。
参考文献链接:https://www.cnblogs.com/duan2/p/9180861.html
TCP协议是一种面向连接的可靠的传输层协议,它保证了数据的可靠传输,对于一些出错,超时丢包等问题TCP设计的超时与重传机制。
其基本原理:在发送一个数据之后,就开启一个定时器,若是在这个时间内没有收到发送数据的ACK确认报文,则对该报文进行重传,在达到一定次数还没有成功时放弃并发送一个复位信号。
这里比较重要的是重传超时时间,怎样设置这个定时器的时间(RTO),从而保证对网络资源最小的浪费。因为若RTO太小,可能有些报文只是遇到拥堵或网络不好延迟较大而已,这样就会造成不必要的重传。太大的话,使发送端需要等待过长的时间才能发现数据丢失,影响网络传输效率。
由于不同的网络情况不一样,不可能设置一样的RTO,实际中RTO是根据网络中的RTT(传输往返时间)来自适应调整的。具体关系参考相关算法。
通过图来了解重传机制:
保活计时器
保活计时器使用在某些实现中,用来防止在两个TCP之间的连接出现长时间的空闲。假定客户打开了到服务器的连接,传送了一些数据,然后就保持静默了。也许这个客户出故障了。在这种情况下,这个连接将永远的处理打开状态。
要解决这种问题,在大多数的实现中都是使服务器设置保活计时器。每当服务器收到客户的信息,就将计时器复位。通常设置为两小时。若服务器过了两小时还没有收到客户的信息,他就发送探测报文段。若发送了10个探测报文段(每一个像个75秒)还没有响应,就假定客户除了故障,因而就终止了该连接
tcp确保数据可靠传输的机制有
** 校验和
序列号
确认应答
超时重传
连接管理
流量控制
拥塞控制**
校验和:发送的数据包的二进制相加然后取反,目的是检测数据在传输过程中的任何变化。如果接收方和发送发检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段。
序列号:TCP报文段的首部序号字段表明传送数据的第一个字节,从而保证了数据的有序提交给应用层。
确认应答: TCP首部携带确认号字段,采用累计确认的方式,即确认报文段确认号之前的报文都已经接收。
超时重传:TCP给每个发出去的报文段都设置一个超时计时器,到超过超时时间还没有收到确认接受报文段时,认为超时,:
连接管理:三次握手、四次挥手
流量控制:TCP 连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。 (TCP 利用滑动窗口实现流量控制)。
拥塞控制:超时使用慢开始和拥塞避免算法,冗余ACK使用快重传和快恢复;