这个是这两天面试的一个问题,没回答上来,在这里整理一下:
(1)网络层进行IP地址的解析
(2)通过DNS得到目标的IP地址,进行域名的解析;
(3)建立TCP连接(三次握手);
(4)开始向web服务器发送请求(get或者post);
(5)服务器的到请求进行响应,开始处理请求;
(6)当完成数据请求或者数据传输时,断开TCP连接(四次挥手)。
IP地址解析:
1.从层次角度看:物理地址是数据链路层和物理层用的地址,而IP地址是网络层和以上的个层使用的地址,是一种逻辑地址(称IP是逻辑地址因为IP地址是用软件实现的)
2.硬件地址:在局域网中,由于硬件地址已经固化在了网卡上,因为在局域网的MAC帧的源地址和目的地址都是硬件地址因此硬件地址有称MAC地址
3.IP地址放在IP数据报的首部,而硬件地址则放在MAC帧的首部。在网络层和网络层以上的使用时IP地址而数据链路层及以下使用的是物理地址 当IP数据报放入数据链路层的MAC帧中后,整个的IP数据报就成为Mac帧的数据因而在数据链路层看不见数据报的IP地址,由于整个互联网所包含的网络规模可能比较大,也可能比较小:将IP地址空间划分成5种不同的类别,每一类具有不同的网络号位数和主机号位数,分别表示不同的网络数和该网络下能容纳的主机位数。
每个IP地址都包含两部分:网络ID和主机ID。网络ID标识在同一个物理网络上的所有主机,同时位数决定了可以分配的网络数目(2^网络号位数-2),主机ID 标识该物理网络上的每一个主机,同时决定了网络中最大的主机数(2^主机号位数-2)
A类地址【大规模网络】,B类地址【中等规模网络】,C类地址【小规模局域网】,D类地址【多播】,E类地址【保留】
DNS得到目标的IP地址,进行域名的解析:
DNS是一套分布式的域名服务系统,即有多个DNS服务器遍布于世界。每个DNS服务器上存放着大量的机器域名和IP地址的映射,并且是动态更新。众多网络客户端程序都使用DNS协议来向DNS服务器查询目标主机的IP地址
(1)迭代查询:主机先向其本地域名服务器进行递归查询->向根域名服务器查询->根域名服务器告诉本地域名服务器,下一次应查询的顶级域名服务器的IP地址->本地域名服务器向顶级域名服务器进行查询->顶级域名服务器告诉本地域名服务器,下一次应查询的权限域名服务器的IP地址->本地域名服务器向权限域名服务器进行查询->权限域名服务器告诉本地域名服务器所查询的主机IP地址->本地域名服务器最后把这个查询结果告诉主机
(2)递归查询:机先向其本地域名服务器进行递归查询->向根域名服务器查询->根域名服务器向顶级域名服务器查询->顶级域名服务器查询->顶级域名服务器向权限域名服务器查询->权限域名服务器告诉顶级域名服务器查询的IP地址->顶级域名服务器告诉根域名服务器查询的IP地址->根域名服务器告诉本地域名服务器查询的IP地址->本地域名服务器最后把这个查询结果告诉主机
三次握手(tcp连接)
1. 第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;
2. 第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;
3. 第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。
完成了三次握手,客户端和服务器端就可以开始传送数据。
(1)客户端向服务器发送连接请求(报文段);
(2)服务器收到请求,对请求进行确认,自己还要发送请求信息(全部放入一个报文段);
(3)客户端收到报文段,向服务器发送确认(ACK报文段);
为什么要进行三次握手?
为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
考虑一次的问题,首先tcp是面向连接,一次握手肯定建立不了连接,因为客户机给服务器发出请求信息却没有得到回应,客户机是没法判定是否发送成功然后建立连接的。
再看两次,假设只有两次握手,比如图中的1,2步,当A想要建立连接时发送一个SYN,然后等待ACK,结果这个SYN因为网络问题没有及时到达B,所以A在一段时间内没收到ACK后,再发送一个SYN,这次B顺利收到,接着A也收到ACK,这时A发送的第一个SYN终于到了B,对于B来说这是一个新连接请求,然后B又为这个连接申请资源,返回ACK,然而这个SYN是个无效的请求,A收到这个SYN的ACK后也并不会理会它,而B却不知道,B会一直为这个连接维持着资源,造成资源的浪费。
四次挥手(断开连接):
第一次分手:主机1(可以使客户端,也可以是服务器端),设置Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;
第二次分手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求;
第三次分手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态;
第四次分手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。
(1)主机1向主机2发送关闭请求(报文段),表示已经没有数据需要发送给主机2了;
(2)主机2向主机1回一个确认,表示同意主机一的关闭请求;
(3)主机2向主机1发送报文段,请求关闭连接;
(4)主机1收到,向主机2发送确认,主机2收到后就关闭连接,主机1等待未收到回复表示服务器端已经正常关闭,主机1也关闭连接。
---------------------
作者:王珂珂
来源:CSDN
原文:https://blog.csdn.net/wangkeke1996/article/details/81747369
版权声明:本文为博主原创文章,转载请附上博文链接!
网友评论