计算机网络整理 TCP协议中的三次握手和四次挥手(图解)   HTTP协议:浏览器和服务器如何通信 浏览器输入网址后的解析与网络请求过程

PING命令使用的是什么协议?

使用的是ICMP协议,是“Internet Control Message Protocol”(Internet控制消息协议)的缩写,是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。

在 TCP 建立连接的三次握手连接阶段,如果客户端发送的第三个ACK包丢了,那么客户端和服务端分别进行什么处理呢?

    相信了解 tcp 协议的人,三次握手的过程肯定很了解了。第三次的 ack 包丢失就是说在 client 端接收到 syn + ack 之后,向 server 发送的 ack 包 由于各种原因 server 没有收到。这时 client, server 分别会进行怎样的处理呢?

Server 端

    第三次的ACK在网络中丢失,那么Server 端该TCP连接的状态为SYN_RECV,并且会根据 TCP的超时重传机制,会等待3秒、6秒、12秒后重新发送SYN+ACK包,以便Client重新发送ACK包。

    而Server重发SYN+ACK包的次数,可以通过设置/proc/sys/net/ipv4/tcp_synack_retries修改,默认值为5.

    如果重发指定次数之后,仍然未收到 client 的ACK应答,那么一段时间后,Server自动关闭这个连接。

Client 端

    在linux c 中,client 一般是通过 connect() 函数来连接服务器的,而connect()是在 TCP的三次握手的第二次握手完成后就成功返回值。也就是说 client 在接收到 SYN+ACK包,它的TCP连接状态就为 established (已连接),表示该连接已经建立。那么如果 第三次握手中的ACK包丢失的情况下,Client 向 server端发送数据,Server端将以 RST包响应,方能感知到Server的错误。

作者:格子灰
链接:https://www.nowcoder.com/discuss/8081?type=1&order=0&pos=105&page=1
来源:牛客网

当客户端收到服务端的SYN+ACK应答后,其状态变为ESTABLISHED,并会发送ACK包给服务端,准备发送数据了。如果此时ACK在网络中丢失,过了超时计时器后,那么Server端会重新发送SYN+ACK包,重传次数根据/proc/sys/net/ipv4/tcp_synack_retries来指定,默认是5次。如果重传指定次数到了后,仍然未收到ACK应答,那么一段时间后,Server自动关闭这个连接。但是Client认为这个连接已经建立,如果Client端向Server写数据,Server端将以RST包响应,方能感知到Server的错误。

为什么要进行三次握手

我们来看一下为什么需要进行三次握手,两次握手难道不行么?这里我们用一个生活中的具体例子来解释就很好理解了。我们可以将三次握手中的客户端和服务器之间的握手过程比喻成A和B通信的过程:

  • 在第一次通信过程中,A向B发送信息之后,B收到信息后可以确认自己的收信能力和A的发信能力没有问题。

  • 在第二次通信中,B向A发送信息之后,A可以确认自己的发信能力和B的收信能力没有问题,但是B不知道自己的发信能力到底如何,所以就需要第三次通信。

  • 在第三次通信中,A向B发送信息之后,B就可以确认自己的发信能力没有问题。

 

HTTP协议:浏览器和服务器如何通信

1.2 在TCP/IP协议栈中的位置

HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。如下图所示:
    计算机网络整理
TCP协议中的三次握手和四次挥手(图解)
 
HTTP协议:浏览器和服务器如何通信
浏览器输入网址后的解析与网络请求过程

默认HTTP的端口号为80,HTTPS的端口号为443。

1.3 HTTP的请求响应模型

HTTP协议永远都是客户端发起请求,服务器回送响应。见下图:
   计算机网络整理
TCP协议中的三次握手和四次挥手(图解)
 
HTTP协议:浏览器和服务器如何通信
浏览器输入网址后的解析与网络请求过程

这样就限制了使用HTTP协议,无法实现在客户端没有发起请求的时候,服务器将消息推送给客户端。

HTTP协议是一个无状态的协议,同一个客户端的这次请求和上次请求是没有对应关系。

1.4 工作流程

一次HTTP操作称为一个事务,其工作过程可分为四步:

1)首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作开始。

2)建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。

3)服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。

4)客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接

如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。

浏览器输入网址后的解析与网络请求过程

1.1.1 用户访问网站的过程?

1. 利用DNS协议进行域名解析

第一步:客户端用户从浏览器里输入www.baidu.com网站地址,回车后,系统首先会查找系统本地的DNS缓存及hosts文件信息,查找是否存在www.baidu.com域名对应的IP解析记录,如果有就直接获取IP地址,然后去访问这个IP地址对应域名www.baidu.com的服务器,一般第一次请求时,DNS缓存是没有解析记录的,而hosts多在内部临时测试时使用。

第二步:如果客户端本地DNS缓存及hosts文件没有www.baidu.com域名对应的解析记录,那么,系统会把浏览器的解析请求发送给客户端本地设置的DNS服务器地址(通常称此DNS为LDNS或首选DNS服务器,即Local DNS)解析,如果LDNS服务器的本地缓存有对应的解析记录就会直接返回IP地址给客户端,如果没有,则LDNS会负责继续请求其他的DNS服务器

第三步:LDNS会从DNS系统的根域(.)开始请求www.baidu.com域名的解析,针对各个层级的DNS服务器系统进行一系列的查找,最终会查找到baidu.com域名对应的授权DNS服务器,而这个授权DNS服务器正是企业购买域名时用于管理域名解析的服务器,这个授权服务器会有www.baidu.com对应的IP解析记录,如果此时没有,就表示企业的域名管理人员没有为www.baidu.com域名做解析设置,即网站还没架设好。

第四步:baidu.com域名的授权DNS服务器会把www.baidu.com对应的最终IP解析记录发给LDNS。

第五步:LDNS把收到的来自授权DNS服务器www.baidu.com对应的IP解析记录(A记录)缓存到本地,再发给客户端,以便下一次更快的返回相同解析请求的记录,这些缓存记录在指定的时间(DNS TTL值控制)内不会过期。

第六步:客户端浏览器获取到了www.baidu.com的对应IP地址的解析记录,会先缓存到本地,接下来,浏览器会请求获得的IP地址对应的网站服务器

2. 建立tcp协议三次握手过程

3. 客户端发出访问网站相应页面请求(发出http协议请求报文)

4. 系统架构部署情况

5. 服务端发出响应访问页面的请求信息(发出http协议响应报文)

6. 断开tcp协议四次挥手过程

2.2.2 HTTP协议1.1版本中的状态

HTTP协议1.1版本中的状态码可以分为五大类,如下表:

状态码范围

作用描述

100-199

用于指定客户端相应的某些动作

200-299

用于表示请求成功

300-399

用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息

400-499

用于指出客户端的错误

500-599

用于指出服务器端的错误

2.3 HTTP响应报文介绍

2.3.1 请求报文结构

报文格式

报文信息

请求行

①. 请求的方法(get方法没有请求主体内容 post方法会有请求主体信息)

②. 请求的数据信息(默认请求index.html首页文件)

③. 请求http协议版本

    tcp协议分为长连接(http1.1)和短连接(http1.0)

请求头部

客户端有关信息说明

空行

空白内容

请求报文主体

get方法没有请求主体内容 post方法会有请求主体信息

2.3.2 响应报文结构

报文格式

报文信息

起始行

①. HTTP协议版本信息

②. 响应的状态码信息(请求成功状态码 200)

③. 响应状态码说明信息

响应头部

服务端有关信息说明

空行

空白内容

响应报文主体

一般为html css js 等等代码信息

查看请求报文与响应报文详细结构信息方法:(2种方法)

1. curl -v www.baidu.com    --- 利用curl命令进行网站访问

          -v      --- 详细显示请求报文结构和响应报文结构信息

2. wget --debug www.baidu.com