网络是怎样连接的

这里写目录标题

  • 第一章、浏览器委托数据
    • 第一步、解析URL
    • 第二步、生成请求消息
    • 第三步、用DNS查IP地址
    • 第四步、委托协议栈发送信息
  • 第二章 用电信号传输TCP/IP 数据
    • 第一步:创捷套接字
    • 第二步:连接阶段
    • 第三步:传输阶段
    • 第四步:断开阶段
    • IP和以太网包的收发

第一章、浏览器委托数据

虽然我们经常使用浏览器来访问web服务器,但实际上浏览器还可以用来在FTP服务器上上传下载文件、也可以当一个电子邮件客户端,所以它能够根据不同的URL来判断应该使用哪种功能。比如访问web服务器时用http:,访问FTP服务器时使用ftp:。

第一步、解析URL

输入URL之后,浏览器首先要对URL进行解析,然后才能生成发送给Web服务器的请求消息。比如一个http请求,http://www.baidu.com/dir1/file.html就是请求这个域名下的dir1目录下的file.html文件。
如果是http://www.baidu.com/dir1/这样末尾是一个[/],代表后面的文件被省略了,一般这种情况下我们会提前在服务器上设置好默认访问的文件名,比如index.html这样。

第二步、生成请求消息

解析过后,我们就需要生成访问web服务器的请求消息了。简单来说请求消息包括两个部分,对哪个文件干什么事儿,哪个文件已经确定了,我们对文件的操作有get、post、put、delete等等,最常用的是get和post,一般我们访问web服务器获取网页数据时就是get方法,在表单上填上数据再发给web服务器就是post方法。然后具体来说,请求消息的内部第一行是请求行,请求行里包括了请求的方法、请求的路径、http版本号。第二行叫做消息头,这里面放着一些请求的附加信息,比如日期、语言、编码格式等等。第三行是空行。第四行开始就是消息体了,这里面就是需要发送的数据。对于GET方法来说,只用请求行和消息头web服务器就已经知道要做什么操作了,POST方法时表单填的信息就在消息体里。

第三步、用DNS查IP地址

生成了HTTP消息之后,我们就可以委托操作系统来把消息发送给对应的WEB服务器了。但这就来了个问题,我只知道服务器的域名,IP我不知道啊。那这时就需要DNS服务器了。
DNS是域名服务系统。我们的计算机上一般都是带着DNS解析器的,它包含在操作系统的Socket库中,这个库是一个用于调用网络功能的程序组件集合。当我们的浏览器调用DNS解析器时,解析器生成一条[告诉我www.baidu.com的IP地址]这种消息,因为解析器不具备使用网络收发数据的功能,所以它会把这条信息委托给操作系统的协议栈来执行,协议栈是操作系统内部的网络控制软件,协议栈就会通过网卡把消息发送给最近的DNS服务器,DNS服务器的IP地址已经是提前设置好的,不用再去查询了,DNS服务器查到之后就会返回具体的IP地址。
那互联网里有成千上万的DNS服务器,我们需要准确找到要访问的WEB服务器的信息是归哪一台DNS服务器管。DNS服务器上有一张表保存着域名和IP地址的对应关系。对于一个域名来说,它是分为多个域的,越右边代表它的层级越高,比如www.baidu.com,可以说是com部baidu科的www这样,管理下级域的DNS服务器的IP地址会注册到上层域的DNS服务器里,查的时候就通过上级DNS服务器一层层查到下级DNS服务器这样。除此之外,互联网里还有一个根域,它里面保存着com、jp等DNS服务器的信息,互联网里所有DNS服务器里都保存着根域服务器的信息。所以只要客户端找到任意一台DNS服务器,就能通过它找到根DNS服务器,然后再顺藤摸瓜找到下层的DNS服务器了。然后DNS服务器的话还有一个缓存功能,里面记着之前查询过的域名,有就直接返回,没有再去查根域DNS服务器。

第四步、委托协议栈发送信息

好了,现在完事具备了,就差发送信息了。数据收发的话主要是四步,我们需要委托操作系统内部的协议栈来向这个IP地址发送数据。简单来说,就是调用Socket库里的组件,在两台机器之间建立一条数据通道,一端收一端发。建立管道的关键就在于管道两端的出入口,也叫做套接字,我们需要先创建套接字,然后再把套接字连接起来形成管道,收发数据完成后断开管道并删除套接字。

第二章 用电信号传输TCP/IP 数据

第一步:创捷套接字

客户端需要调用Socket库中的socket程序组件,创建完成之后协议栈会返回一个描述符,应用程序把这个描述符放到内存中,这个描述符的作用是用来识别不同的套接字的,因为计算机可能会同时访问多个不同的web服务器,这就会有多个不同的套接字。一般来说服务器一方的应用程序在启动时就会创建好套接字然后进入等待连接的状态,而客户端则是在需要时再创建。

第二步:连接阶段

连接阶段就是委托协议栈把客户端创建的套接字和服务器的套接字连接起来,应用程序会调用Socket库里的connect组件来完成这个工作,调用connect时需要传三个参数:描述符、IP地址、端口号,这个端口号就是用来确定连接对象的套接字,浏览器访问web服务器一般默认都是80,这时已经规定好的我们不用去管。这个时候客户端已经知道自己应该连接哪个套接字了,连接成功后,协议栈会把对方的IP地址和端口号保存在套接字里面,然后开始传输数据。
客户端会生成一个SYN=1的TCP包发送给服务器,这个TCP包的头部还会包含客户端向服务器传数据时使用的初始序号,还要服务器向客户端发送数据时需要用的窗口大小。服务器接到包之后,会返回一个SYN=1的TCP包,这个包的头部也包含了序号和窗口大小,另外还有一个表示确认已经收到包的ACK号。客户端收到包之后,回再返回一个包含确认ACK号的TCP包。连接阶段结束,可以进行数据收发了。

第三步:传输阶段

客户端传输数据会调用用Socket库里的write组件,当服务器接收到消息之后会返回响应,客户端需要调用Socket库的里read程序组件来接收。
传输开始时,TCP会把请求消息切分成一定大小的块,然后在每一块前面加上TCP头部,然后发给服务器,服务器收到后会返回ACK号。

第四步:断开阶段

收发阶段结束之后,web服务器会调用Socket库里的close组件来先发起断开过程,服务器会发送一个FIN=1的TCP包,然后客户端返回一个表示确认收到的ACK号。然后双方再交换一组方向相反的FIN=1的TCP包和包含ACK号的TCP包,再等待一段时间,套接字被删除,整个过程结束。

IP和以太网包的收发

发送包
包是由头部和数据两部分组成的,对于TCP/IP包来说,它有两个头部,分别是MAC头部和IP头部。IP头部包含根据IP地址把包发往目的地所需的控制信息。MAC头部包含通过以太网的局域网把包传输到最近的路由器所需的控制信息。包的目的地IP地址就写在IP头部里,转发模块会根据这个IP地址在路由表中进行查询,去找下一个路由的位置。然后IP协议会委托以太网协议把包传输过去,IP协议会查找下一个路由的MAC地址,但这个时候我们其实是不知道具体的MAC地址是多少的,这就需要ARP地址解析协议了,它首先会先查一下自己的ARP缓存有没有,如果没有就广播所有设备[这个IP地址是谁的,把你的MAC地址告诉我],得到回复后把得到的MAC地址写到MAC头部中,然后以太网协议把包发到对应路由器上。比如封好的包会以0和1组成的数字信息交给网络硬件网卡,网卡把这些数字信息转换为电信号或者光信号,然后再通过网线发送出去,到达集线器或者路由器这些转发设备之后,再被转发出去一步步直到接收方。
接收返回包
当服务器返回网络包后,MAC模块会把信号转换成数字信息,然后检查包的MAC头部里的MAC地址和自己的MAC一致不,不一致就扔了,一致就留下然后通知计算机收到了一个包,网卡驱动会把它交给TCP/IP协议栈来处理,IP模块会先检查包的IP头部确认格式是否正确,如果格式OK就开始看接收方的IP地址和客户端网卡的地址一致不,一致就接收,不一致就通过ICMP消息告诉发送方。那么接收的时候可能还会有个分片重组,因为传输时一般都是把大包分割成小包传输的,那接收时就需要重组成大包。那这个时候MAC模块和IP模块的工作都已经结束了,接下来包就给了TCP模块,TCP模块会根据IP头部里接收方和发送方的IP地址,以及TCP头部中的接收方和发送方端口号来查找对应的套接字。找到套接字之后就执行包里的具体内容。
所以,IP(路由器)负责把包送到通信对象这一整个过程,而其中把包传输到下一个路由器的过程是由以太网(交换机)来负责的。

你可能感兴趣的:(读书笔记,网络)