1什么是TCP网络分层
1.1分层描述
网络访问层:
2 TCP的三次握⼿中为什么是三次?为什么不是两次、四次?
两次握手的话,服务端会单方面认为建立已经成功,但是对于客户端而言,可能只是开个玩笑的,这样对于服务端来说是不公平的,也是链接资源的浪费.
4次呢,有点浪费资源了,完全没必要,3次就够了
3TCP的四次挥⼿为什么是四次?为什么不能是三次?
首先,tcp的挥手是终止一次tcp的链接。也就是说在断开一次tcp的链接的时候,客户端和服务端总共需要发送4次报文。用来确认链接已经断开。
如图: 客户端发送的报文种FIN给服务端,服务端进行确认并响应ACK给客户端表示可以断开。
同时 服务端表示我也需要断开,因此向客户端也发送了一个FIN,客户端接收到服务端的FIN之后也进行了响应ACK=y+2.这就是4次挥手的报文.
why不能优化成3次呢?
假设优化成3次,那么就是在服务端发送客户端的响应ACK和服务端发送自己的FIN的地方,合并成一个报文,但是合并之后,可以实现么?
当服务端接收到客户端的断开请求后FIN,服务端只是进入了CLOSR_WAIT的状态(也就是再等等的意思,首先针对这个请求进行确认即发送ACK确认,其次的话就是服务端可能有些资源还没释放,请求请求没有处理掉,所以ACK,FIN之间可能有大的延迟)
服务端最终的LAST_ACK发送出去的时候,由于响应时间长(30S),会导致客户端进行重发,进行重试请求.
断开请求FIN
确认请求ACK
4、为什么 SYN/FIN 不包含数据却要消耗⼀个序列号?
凡是需要对端确认的,⼀定消耗TCP报⽂的序列号。
SYN 和FIN需要对端的确认,所以需要消耗⼀个序列号。
如果没有seq,则有可能会导致重发,因此只要的需要端的确认,必须有seq
5、什么是半连接队列?什么是SYN Flood攻击?
客户端⼤量伪造 IP 发送 SYN 包,服务端回复的 ACK+SYN 去到了⼀个「未知」的 IP 地址,势必会造
成服务端⼤量的连接处于 SYN_RCVD 状态,⽽服务器的半连接队列⼤⼩也是有限的,如果半连接队列满,也会出现⽆法处理正常请求的情况。
客户端大量伪造的ip,发起第一次链接SYN,那么服务端进行响应ACK+SYN去,这样服务器就会处于半连接状态。成为SYN FLOOD攻击或洪范攻击。
6、说说TCP快速打开(TFO)的原理!
TCP 快速打开(TCP Fast Open,TFO)
TFO 是在原来 TCP 协议上的扩展协议,它的主要原理就在发送第⼀个 SYN 包的时候就开始传数据了,
不过它要求当前客户端之前已经完成过「正常」的三次握⼿。
快速打开分两个阶段:请求 Fast Open Cookie 和 真正开始 TCP Fast Open
Fast Open Cookie
我们知道tcp建立连接需要进行3次握手,这里的是一种快速打开方式TFO。
当发送SYN包的时候,head种包含一个cookie,只不过这个时候还是空的,表明客户端要请求fast open cookie .
服务端收到SYN包的时候,生成cookie的值并且连同ACK_SYN_COOKIE一起发送给客户端
客户端在收到cookie会缓存在本地,这个阶段就是fast open cookie
TCP Fast Open
在该阶段,客户端就会携带了cookie,并由服务端进行确认cookie的合法性,如果合法,就发送ack确认,如果不合法就丢弃包,走正常的3次握手
7、TCP报⽂中的时间戳有什么作⽤?
上图是报文的头部,时间戳就是加在head的选项中
下图是时间戳的构成,分别是:类别,长度,发送方时间戳,回显时间戳
RTT
假设在没有启动时间戳的时候,发送重传的情况下,计算时延是比较尴尬的,如上图所示,但是开启了时间戳就不一样了,可以进行计算.
在启⽤ Timestamps 选项以后,因为 ACK 包⾥包含了 TSval 和 TSecr,这样⽆论是正常确认包,还是
重传确认包,都可以通过这两个值计算出 RTT。
当seq满了以后,会从来开始,也就是回绕
8、TCP 的超时重传时间是如何计算的?
TCP 具有超时重传机制,即间隔⼀段时间没有等到数据包的回复时,重传这个数据包。
这个重传间隔也叫做超时重传时间(Retransmission TimeOut, 简称RTO)
RTO设置的太小的话,没必要,有可能导致不必要的重传,因为服务端可能是延迟,但是设置太大,需要很久才会重传.
9、能不能说⼀说 TCP 的流量控制?
通过设置服务端的缓冲区的大小来决定tcp的数据传输大小。
服务端响应的ack中就有窗口大小,用于通知客户端缓存区的大小.
接收窗⼝(接收缓冲区中空闲的部分)
buffer中可能存在上一次发送,但是还没有处理完的数据。如上图所示
发送端比较慢的情况就是:发送的buffer中有可以待发送的数据
发送到比较快的情况就是:buffer中的全都发出去了,但是可能还没有收到ack.
因为接收端的响应ACK中包含了窗口大小,发送端就可以进行控制.
10、如何理解 TCP 的keep-alive的原理?
TCP 协议的设计者考虑到了这种检测⻓时间死连接的需求,于是乎设计了 keepalive 机制。
它的作⽤就是探测对端的连接有没有失效,通过定时发送探测包来探测连接的对端是否存活,不过默认
情况下需要 7200s 没有数据包交互才会发送 keepalive 探测包,往往这个时间太久了,我们熟知的很多组件都没有开启 keepalive 特性,⽽是选择在应⽤层做⼼跳机制。
11、聊⼀聊TCP中的端⼝号
端⼝号的英⽂叫Port,英⽂原意是"港⼝,⼝岸"的意思
端⼝号与⽹络分层
端口号位于传输层,并且是在TCP的头里面
分别由源断开,目标端口
TCP ⽤两字节的整数来表示端⼝,⼀台主机最⼤允许 65536 个端⼝号的
已登记的端⼝号:范围1024~49151
● MySQL:3306
● Redis:6379
● MongoDB:27017
临时端⼝号:范围49152~65535
一般访问目标服务器,自己的主机开通的源端口一般使用临时端口号
12、TCP场景问题1
13、TCP场景问题2
服务端收到 IP 数据包解析以后,它怎么知道这个分组应该投递到上层的哪⼀个协议(UDP 或 TCP)?
14、TCP场景问题3
15、讲⼀讲telnet的⽤法
16、讲⼀讲netstat的⽤法
netstat 命令⽤于显示各种⽹络相关信息
17、讲⼀讲tcpdump的⽤法
tcpdump 则是⼀个命令⾏的⽹络流量分析⼯具,功能⾮常强⼤,⼀般我们⽤来抓TCP的包。
tcpdump -i any
以上命令表示监听所有的网卡,一般不这么用
tcpdump -i any host 192.168.0.1
表示监听这个IP
18、讲⼀讲wireshark的⽤法
tcpdump,它是命令⾏程序,对 linux 服务器⽐较友好,简单快速适合简单的⽂本协议的分析和处理。
wireshark 有图形化的界⾯,分析功能⾮常强⼤,不仅仅是⼀个抓包⼯具,且⽀持众多的协议。