笔记杂谈
欢迎阅读
前言
之所以记录这些,是因为看了别人的笔记总是记不住。为了加深记忆,本文会记录一些比较经典的题目,还是选择敲一点东西,以后要回来阅读也更容易一些。
一、TCP的三次握手和四次挥手
想要了解三次握手和四次挥手,首先得了解TCP报文的主要字段的意思。
- 序列号(seq):表示发送的数据字节流,因为传输的过程中数据是分成一片一片同时传输的,为确保报文到达目的后能正确拼接。对数据每个字节编号,其中报文段的序列号就是第一个字节的数据编号。
- 确认号(ack):表示发送方期待接收的下一序列号,接收成功后的数据字节序列号加1。
- ACK:标志确认号有无。只有ACK=1,ack才有效,ACK=0表示报文不含ack。
- SYN:标志连接请求序列号。SYN=1表示请求连接。
- FIN:结束标志,用于释放连接,FIN=1表示关闭本方数据流。
需要注意的是,大写的ACK、SYN和小写的ack、syn不是一回事,前者只是作为标志位,后者才是序号。
三次握手的过程
分析握手之前,我们需要知道的一点是,握手需要
1、客户端知道自己能接收、发送和服务器能接收、发送;
2、服务器知道自己能接收、发送和客户端能接收、发送。
知道之后我们开始分析:
- 第一次握手:客户端发送一个请求给服务端,请求内容有 SYN=1,seq=x(x为一个随机数)。
此时服务器收到后知道客户端能发送,自己能接收了。
- 第二次握手:服务器发送给客户端一个包,让客户端知道服务器已经接收到了,所以发送了一个确认号ack,想知道自己能不能发送请求,所以自己也发送了一个序列号seq。包里面内容包括ACK=1,SYN=1,seq=y(y为一个随机数),ack=x+1。
此时客户端收到后知道自己能接收、发送了,并且知道服务器能接收、发送了。
- 第三次握手:客户端向服务器发送一个确认,让服务器知道了客户端能接收,服务器能发送了。请求内容包括ACK=1,seq=x+1,ack=y+1,
此时服务器也知道了自己能接收、发送,客户端能接收、发送。三次握手完毕。
四次挥手过程
- 第一次挥手:客户端请求断开。发出释放FIN=1,序列号seq=u(u是一个随机数)。
- 第二次挥手:服务器收到客户端的请求后,确认断开请求。发出确认号ACK=1确认标志和确认好ack=u+1,并且发送自己的序列号seq=v(v是一个随机数)。
- 第三次挥手:服务器请求断开。发出释放FIN=1,确认ACK=1确认标志和确认号ack=u+1,并且发送自己的序列号seq=w(w是一个随机数)。
- 第四次挥手:客户端收到后,发送确认ACK=1,ack=w+1,自己的序列号seq=u+1。客户端经过2个最长报文段寿命后,客户端CLOSE;服务器收到确认后,立刻进入CLOSE状态。
常见问题:
为什么是三次握手和四次挥手呢?
- 三次握手是因为第二次握手时,服务器同时把确认标志ACK和序列号标志SYN一起发送给客户端。
- 四次挥手是因为第二次挥手,服务器端这边在收到客户端的断开请求时,可能还在向客户端传输其他数据,所以会先发确认标志ACK,表示自己收到了确认断开请求。在所有数据发完之后才会发送FIN断开请求。
为什么客户端最后要等待2MSL
- 因为如果客户端最后一次发送的ACK报文没发送成功,服务器会一直开着等待客户端的请求,如果到一定的时候一直没有回复的话,服务器可以请求客户重发,在2MSL时间内,客户端是还可以重发给服务器的。