三次握手:syn、sny+ack、ack
1. 为什么建立连接 tcp是一个可靠的传输机制,可靠在于每次收到一个数据都会相应的收到一个确认包之后才会将缓冲区的内容给删除掉,否则过一段时间就会重传。 建立连接就像是侦察兵侦查道路一样,我先看看这条路能不能走,如果能走,后面的大部队就跟上来了,如果不能走,后面的大部队就等着我继续侦查。 2. 为什么要用标志位syn? 案例一: 没有标志位syn的对话 客户端:嗨,服务器 服务器:你恐怕是*吧,给我发这个干嘛呢!! 案例二: 有标志位syn的对话 客户端:嗨,服务器,我们开始连接吧 服务端:好的,可以 syn: 告诉服务端发送这条数据的客户端想通过三次握手建立tcp连接 3. 为什么要用标志位seq,ack 案例: 客户端:嗨,服务器,这是我要跟你连接的第一条数据。 seq=1,syn=1 服务器:一看序列号是1,syn是1,是想和我连接的,因此给他回复:好的,我已经收到你的数据了,我们可以连接了。 seq=10,ack=2此时的ack是收到数据的seq号加上1 客户端:一看ack是2,就是我上一条数据的序列号加1,看来服务端已经同意我要连接了,因此回复:大哥,那我们开始发送数据吧。 seq=2,ack=11,此时三次握手建立成功 seq:用来表示当前数据包的标号 ack: 它的值是收到数据的seq值加上一,用来告诉对方我收到了你的数据包。 4. 状态机是什么意思? (1)我们会看到在图的左右两边有syn_send,syn_listen等字样,这个指的是在客户端或者服务端收到某条信息之后会进入到哪个状态中。这个状态就是tcp的状态机。 (2)为什么要有这个状态机,因此tcp的连接或者断开都是有一个明显的过程中,对于每个过程都表示一个状态对于以后的排查问题是很重要的,例如:当前有大量的tcp状态是处于syn_rvcd,这很明显是有问题的。 5. 为什么要用三次握手去建立连接,一次不行吗? 之前已经说过,tcp的可靠机制是由于会发送确认包,因此在建立连接的时候我必须要确认我发送的信息你是否收到了,如果没有收到,我是会继续发送的。 案例: 客户端:嗨,大哥,我们连接吧?(如果就这样就完了,那我客户端怎么知道我这条连接的数据到底发送成功没有呢?因此服务器必须给我回复信息,也就是第二次连接了) 服务器: 行,我们连接吧!(如果这样就完了,那么服务器就会想了,这条数据客户端到底收到了没有,没有收到咋办,真让人头疼,因此大哥跟你小弟说话了,不管怎样,你的表个态,这就有了第三次连接了) 客户单:好嘞,大哥,小弟知道了,我们开始发送数据吧。 (至此真正的连接才算完成)
四元组
源ip+port 目ip+port 建立绝对唯一的连接;例如:IPA:0 IPB:80,IPA:1 IPB:80就是两种方式
四层挥手总述
1. 为什么是服务端先发起的断开连接请求? 对于客户端而言,我们一般是向服务器索求数据的,因此当服务器端把我们所需要的数据完全的发送给客户端之后,为了提升工作效率,就会迫不及待的关掉连接,然后去做处理其他的请求。因此一般我们看到的都是服务器端先发送一个fin标志位为1的数据包表示服务器端想断开连接。 2. 标志位FIN 和三次握手的SYN一样,此处的FIN就是为了告诉对方我想断开连接 3. 为什么要用四次挥手去断开连接? 因为在tcp建立连接之后数据的交互是双向的,因此tcp连接也给我们虚拟出了两个通道,一个是server--->client的通道,一个是client--->server的通道 当我们的服务器数据传输完成之后server--->client的通道已经没有存在的必要的了,因此server发送fin断掉此通道的连接,但是此时的client--->server还要给server端发送ack确认报文,因此此时这个client-->server的通道还不能断开 当服务器收到了ack报文之后,也就代表着client--->server的的通道已经没有必要在存在了,因此客户端向服务端发送断开请求,服务端发送一个ack确认断开之后就可以断开了。 4. 当出现了大量的TIME_WAIT状态代表的是出现了高并发的请求。