用户输入URL到网页显示之间发生了什么(三次握手 四次挥手)

一、输入网址,DNS解析网址为IP地址,通过IP访问

DNS解析过程

  • DNS协议运行在UDP协议之上,使用端口号53。
  • 人们习惯记忆域名,但机器间互相只认IP地址,域名与IP地址之间是对应的,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,整个过程是自动进行的。
  • 步骤1是客户端向服务器发出DNS请求。步骤2是服务器向客户端回送IP响应。

二、客户端如何与服务器建立连接?TCP的三次握手与四次分手

1、为什么要三次握手而非一次握手?

谢希仁版《计算机网络》:
“client 发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但 server 收到此失效的连接请求报文段后,就误认为是 client再次发出的一个新的连接请求。于是就向 client 发出确认报文段,同意建立连接。假设不采用 “三次握手”,那么只要 server发出确认,新的连接就建立了。由于现在 client 并没有发出建立连接的请求,因此不会理睬 server 的确认,也不会向 server发送数据。但 server 却以为新的运输连接已经建立,并一直等待 client 发来数据。这样,server 的很多资源就白白浪费掉了。采用 “三次握手” 的办法可以防止上述现象发生。例如刚才那种情况,client 不会向 server 的确认发出确认。server 由于收不到确认,就知道 client 并没有要求建立连接。”

  • 原因1:防止建立连接的包在网络中延迟了,另一方误以为连接建立,浪费资源。比如你和朋友说下午见面,结果信息传达延迟,第二天才送到,你以为被放鸽子了,结果朋友第二天下午见面,发现被放鸽子的是他。当建立连接正常的时候,证明网速尚可,不用服务器端(或客户端)浪费资源去建立失效的链接(且由于网络的带宽固定,可减少垃圾信息占用其他的速度)。

一个类比:
三次握手:A:听得到吗? B:听到,你听得到我吗? A:听到了,然后一起说内容
二次握手:A:听到吗?B:听到,你听到我吗? A:@%#jkl B:你听到我吗? A:jklhg# ……
四次握手 A:听到吗? B:听到,你听到我吗? A:听到,你听到我吗?B:听到 ……开说(浪费了一次)
注:如果没有收到回复,则会超时重发请求

原因2:防止收到重复包,类似于原因1,但有区别,由于TCP可能重连或者乱序或者一系列其他原因,为了防止收到重复的包,需要一个序号来标记是第几个包(如下载一个视频,肯定是分段的,遇到意外重复发的短要舍弃,同时,有的段可能延迟了,从而先收到后面的,但是你下载到客户端时要重新排序)。而实现这个,需要先约定初始的序号,以区分是和谁的连接。
TCP 需要 seq 序列号来做可靠重传或接收,而避免连接复用时无法分辨出 seq 是延迟或者是旧链接的 seq,因此需要三次握手来约定确定双方的 ISN(初始 seq 序列号)。

如果有一个全局统一的时钟,那么是可以不需要三次握手,甚至不需要握手,直接通信的。
https://baijiahao.baidu.com/s?id=1593714120815701015&wfr=spider&for=pc

为什么握手是三次?
1、客户端和服务端说,我要建立连接了 随机产生一个seq_i
2、服务端和客户端说,你确定要建立连接么?你的连接不是之前延迟发出的么?也随机产生一个seq_j,并且ack=seq_i+1
3、不是延迟发出的啊! ack = seq_j+1 seq_i ++;
在这里插入图片描述
确认ACK:占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效

同步SYN:连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。

为什么四次握手?(这里的客户端和服务端改成被动、主动的更合适)
1、客户端发我没有数据传给你了,要关闭连接了,你还有么
2、服务端可能还有要发送的数据,所以为了统一 先不直接说我也要关了 而是说,好的我收到你要的信息了,我看看我还有没有要关闭的东西 为了让对方闭嘴 不要再发送消息过来确认浪费资源了 我自己该干啥先干啥
3、服务端说 我这边也解决了 我们之间可以关闭了 (若没受到4的回复,可能会一直发)
4、客户端说 好的 收到了 你可以闭嘴了 我们关闭把

在这里插入图片描述

为什么握手只用三次,而挥手要四次?
因为四次挥手中的2和3 在连接建立阶段可以合并 不需要等待那一方是否还有数据要发送

理论上,四个报文都发完了,就可以直接关闭了,那为什么time_wait还需要2msl的时间才能返回close状态?
因为我们要假设网络是不可靠的,若最后发的确认信息服务端没有受到,那么服务端会一直重发关闭的信息过来,说如果收到 证明最后的一步丢失了 因而需要等待等待

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值