1.首先我们先来看看一个tcp报文格式,tcp报文包括首部和数据部分,其中首部的具体字段如下:
重要字段的意义如下:
1.源端口和目的端口字段--各占16bit,端口是传输层与应用层的服务接口
2.序号字段--SEQ序号,占32bit。tcp连接中传送的数据流中的每一个字节都遍上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号
3.ACK确认序号,占32 bit,是期望收到对方的下一个报文段的数据的第一个字节的序号。只有ACK标志位为1时,确认序号字段才有效,ACK=SEQ+1
4.标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,比较常见具体含义如下。
确认比特ACK--只有当ACK=1时确认号字段才有效。当 ACK=0时,确认号无效。
同步比特SYN--同步比特SYN置为1,就表示这是一个连接请求或连接接受报文。
终止比特 FIN(FINal)--用来释放一个连接。当FIN=1时,表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。
需要注意的是:不要将确认序号ACK与标志位中的ACK搞混了;确认方ACK=发起方SEQ+1,两端配对
2.TCP3次握手过程图:
第一次握手:Client(主机A)向Server(主机B)发送一个连接请求,在这个包中,标志位SYN=1,发送序号SEQ=x,上图中x=200,
Client进入SYN_SEND状态,等待Server确认。
第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,确认序号ACK=x+1=201,
随机产生一个发送序号SEQ=y,上图中y=500,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
第三次握手:Client收到确认后,检查确认序号ACK是否为x+1=201,标志位ACK是否为1,如果正确,则将标志位ACK置为1,
确认序号ACK=y+1=501,并将该数据包发送给Server,Server检查确认序号ACK是否为y+1=501,标志位ACK是否为1,
如果正确则连接建立成功,Client和Server进入ESTABLISHED状态。
完成三次握手,客户端与服务器开始传送数据。
3.TCP4次挥手过程图:
第一次挥手:当客户A要断开TCP连接时,发送一个包,其中标志位fin=1,ACK=1,发送序号SEQ=x,确认序号ACK=y,上图中x=200,y=500。Client进入FIN_WAIT_1状态。
第二次挥手:客户B知道A要断开后,发送一个确认包,其中标志位ACK=1发送序号,SEQ=y确认序号ACK=x+1=201,Server进入CLOSE_WAIT状态。
第三次挥手:客户B也断开TCP连接,此时发送一个包,其中,标志位fin=1,发送序号SEQ=y+1=501,Server进入LAST_ACK状态
第四次挥手:客户A收到B的断开请求后,Client进入TIME_WAIT状态,接着发送一个确认包,标志位ACK=1,发送序号SEQ=x+1=201,确认序号ACK=y+2=502;Server进入CLOSED状态。
由于TCP连接是全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,
发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,
但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。
4. DNS解析过程
DNS 解析 互联网每台机器的唯一 ID 是 IP地址,但是 IP地址不方便记忆,所以开发者发明了域名系统(DNS),将 IP地址和域名进行一一对应。
得到具体 IP地址的过程就叫做 DNS 解析。
具体的 DNS 解析流程包括:
1.查找浏览器缓存
浏览器提供了 DNS 数据缓存功能,如果一个域名已经被解析过,浏览器会把结果缓存下来,在缓存失效之前,下次处理直接走缓存,不需要经过 DNS 解析以提高加载速度。
2.查找系统 Host 文件配置
浏览器在查找不到缓存之后,会去本地硬盘 Host 文件进行查找,看看里面有没有对应域名和 IP地址的规则,如果有则使用,否则进入下一步。
3.如果本地没有查找到相应的配置之后,浏览器会发送 DNS 请求到本地DNS服务器。
4。本地DNS服务器在接收到请求之后,会先查找递归查找自己的缓存记录,有缓存则直接返回,否则向根DNS服务器发送请求。
5.根DNS服务器
根DNS服务器在接收到本地DNS服务器之后,并不会直接返回域名和IP地址之间的对应关系,而是告诉本地DNS服务器可以到域服务器上面去查找,并给出域服务器的地址,这个过程是迭代的。
6.本地DNS服务器向域服务器发送请求
本地DNS服务器在接收到根DNS服务器的响应之后,会向对应的域服务器发送请求,例如当前例子中的域服务器是 .com域服务器。
7.域服务器接收到请求后,也不会直接返回域名和IP地址之间的对应关系,而是告诉本地DNS服务器,你请求的域名的解析服务器的地址。
8.本地DNS服务器向解析服务器发送请求
最后,本地DNS服务器向解析服务器发送请求,获取到了一个域名和IP地址的对应关系,本地DNS服务器把这个对应关系返回给浏览器,并缓存在自己本地。