输入URL,点击回车,然后发生了啥捏。
总体分4步:
1、DNS域名解析,得到IP,进行访问
2、TCP三次握手建立连接
3、发送与接收数据
4、TCP四次挥手断开连接
详细点讲:
1:访问两种方式--ip(不好记)和域名。输入域名,还要DNS服务器转换成ip的。
DNS域名解析时用的是UDP协议。整个域名解析的过程如下:
- 浏览器向本机DNS模块发出DNS请求,DNS模块生成相关的DNS报文;
- DNS模块将生成的DNS报文传递给传输层的UDP协议单元;
- UDP协议单元将该数据封装成UDP数据报,传递给网络层的IP协议单元;
- IP协议单元将该数据封装成IP数据包,其目的IP地址为DNS服务器的IP地址;
- 封装好的IP数据包将传递给数据链路层的协议单元进行发送;
- 发送时在ARP缓存中查询相关数据,如果没有,就发送ARP广播(包含待查询的IP地址,收到广播的主机检查自己的IP,符合条件的主机将含有自己MAC地址的ARP包发送给ARP广播的主机)请求,等待ARP回应;
- 得到ARP回应后,将IP地址与路由的下一跳MAC地址对应的信息写入ARP缓存表;
- 写入缓存后,以路由下一跳的地址填充目的MAC地址,以数据帧形式转发;
- 转发可能进行多次;
- DNS请求到达DNS服务器的数据链路层协议单元;
- DNS服务器的数据链路层协议单元解析数据帧,将内部的IP数据包传递给网络层IP协议单元;
- DNS服务器的IP协议单元解析IP数据包,将内部的UDP数据报传递给传输层UDP协议单元;
- DNS服务器的UDP协议单元解析收到的UDP数据报,将内部的DNS报文传递给DNS服务单元;
- DNS服务单元将域名解析成对应IP地址,产生DNS回应报文;
- DNS回应报文->UDP->IP->MAC->我的主机;
- 我的主机收到数据帧,将数据帧->IP->UDP->浏览器;
- 将域名解析结果以域名和IP地址对应的形式写入DNS缓存表。
TCP三次握手:
这是最基本的一个问题了,描述三次握手:
1、客户端发送SYN包,序列号为j,进入SYN_SEND状态;
2、服务器端接收到SYN包,必须确认SYN包(确认报文ACK,序列号为j+1),同时自己也发送一个SYN包,序列号为k,此时服务器端进入SYN_RECV状态;
3、客户端接收到这两个包ACK+SYN包,回复一个ACK包,序列号为k+1,此时客户端处于建立连接状态;
4、服务器接收到ACK包,处于建立连接状态。
可以开始传输数据啦!!!
问:客户端什么情况才处于建立连接状态?服务端什么时候处于建立连接状态?为啥不能两次握手就得了?
客户端简单,申请建立连接,收到服务器的确认包(ACK+ SYN)就处于建立连接喽;服务器从收到请求,到发出确认包,再到收到确认包,才建立连接;
两次握手,会有无效连接占用服务器资源的危险。比如,客户端发送请求,结果由于网络原因,滞后了;然后过段时间(客户端认为是无效请求了),服务器接到了,发了个确认包,如果两次握手,这就意味着服务器认为和客户端建立了连接,那么就会