计算机网络基础——http请求过程

http请求过程:

客户机在请求服务器http页面的时候依据osi七层模型进行封装。

端口号:代表服务器当中的一个进程,或者是一个程序。

每层的详细封装过程如下:

 

数据链路层封装的时候目的MAC是如何获取的?

       TCP/IP里面是用的ARP协议。比如新建了一个内网,如果一台机器A找机器B,封装FRAME时(OSI的第二层用的数据格式),要封装对方的MAC,开始时A不知道B的MAC,只知道IP,它就发一个ARP包,源IP是自己的,目的IP是B的,源MAC是自己的,目的MAC是广播的。然后这个请求包在内网内被广播,当其他机器接到这个包时,用目的IP和自己的IP比较,不是的话就丢弃。B接到时,发现IP与自己的一样,就答应这个包的请求,把自己的MAC送给A。如果B是其他子网的机器,那么路由器会判断出B是其他子网,然后路由器把自己的MAC返回给A,A以后再给B发包时,目的MAC封装的是路由器的。

       服务端在接收到包文之后会看报文中的MAC地址是否为自己的mac地址,1.如果服务器端为最终的服务器,如果是自己mac地址,那么就向上层传递。如果不是就丢弃。2.如果服务端是交换机或者路由器,那么在交换机或者路由器第一次使用的时候会发起广播来寻找改mac地址,之后进行转发。随后变记录在交换机或者路由器的mac地址表中。再之后如果有相同的mac通信的时候直接转发到交换机或者路由器的端口上去。

TCP层:

服务端为服务器时,数据链路层判断mac是我自己的,那么向上层传递到ip层。ip层判断是我自己的ip,那么在向上层传递到传输层(具体的端口)。

在传输层中每一个真实的数据请求在发出之前要进行三次握手,当三次握手成功之后,这个数据请求才会真正的发出去。

第一次握手  SYN

服务端第二次握手及返回确认信息 SYN+  ACK

第三次握手 客户端只做回复。ACK; 同时发送真正的数据请求。

客户端真实的数据请求:

 

服务端响应该请求:

此时客户端上并不能看到网页信息。当客户机接收到服务端的信息后才能看到网页信息。之后客户端发起四次分手 FIN +ACK

疑问四,为什么需要四次分手?

TCP是双向的,所以需要在两个方向分别关闭,每个方向的关闭又需要请求和确认,所以一共就4次。

一个传输粒度包括:三次握手,传输,四次分手。

在创建连接时,

1.客户端首先要SYN=1,表示要创建连接,

2.服务端接收到后,要告诉客户端:我接受到了!所以加个ACK=1,就变成了ACK=1,SYN=1

3.理论上这时就创建连接成功了,但是要防止一个意外,所以客户端要再发一个消息给服务端确认一下,这时只需要ACK=1就行了。

为什么需要三次握手?

下面解释明明两次就可以建立连接的为什么还要加第三次的确认。

如果发送两次就可以建立连接话,那么只要客户端发送一个连接请求,服务端接收到并发送了确认,就会建立一个连接。

可能出现的问题:如果一个连接请求在网络中跑的慢,超时了,这时客户端会从发请求,但是这个跑的慢的请求最后还是跑到了,然后服务端就接收了两个连接请求,然后全部回应就会创建两个连接,浪费资源!

如果加了第三次客户端确认,客户端在接受到一个服务端连接确认请求后,后面再接收到的连接确认请求就可以抛弃不管了。

三次握手完成!

在四次分手时,

1.首先客户端请求关闭客户端到服务端方向的连接,这时客户端就要发送一个FIN=1,表示要关闭一个方向的连接

2.服务端接收到后是需要确认一下的,所以返回了一个ACK=1

3.这时只关闭了一个方向,另一个方向也需要关闭,所以服务端也向客户端发了一个FIN=1 ACK=1

4.客户端接收到后发送ACK=1,表示接受成功

四次分手完成!

我为什么没有在上面的过程中,加入seq和ack呢?就如我对这两个关键字的解释的一样,这两个是数据拆分和组装必备元素,所以所有的请求都需要这两个元素,只要明白了作用,就可以自己举一反三。

关于握手和分手,主要还是SYN,FIN,ACK的变化,这才是重点!

https://baijiahao.baidu.com/s?id=1593714120815701015&wfr=spider&for=pc

猜你喜欢

转载自www.cnblogs.com/zl181208/p/10087258.html