HTTP网络编程的理解

一、网络分层

网络分层的每一层都是为了完成一种功能而设的。为了实现这些功能,就需要遵守共同的规则,这个规则叫作“协议,网络分层有不同的模型,有的模型分7层,有的模型分5层,

 

应用层→传输层→网络层→数据链路层→物理层

 

1.物理层
该层负责比特流在节点间的传输,即负责物理传输。该层的协议既与链路有关,也与传输介质有关。其通俗来讲就是把计算机连接起来的物理手段。
2.数据链路层
该层控制网络层与物理层之间的通信,其主要功能是如何在不可靠的物理线路上进行数据的可靠传递。为了保证传输,从网络层接收到的数据被分割成特定的可被物理层传输的帧。帧是用来移动数据的结构包,它不仅包括原始数据,还包括发送方和接收方的物理地址以及纠错和控制信息。其中的地址确定了帧将发送到何处,而纠错和控制信息则确保帧无差错到达。如果在传送数据时,接收点检测到所传数据中有差错,就要通知发送方重发这一帧。
3.网络层
该层决定如何将数据从发送方路由到接收方。网络层通过综合考虑发送优先权、网络拥塞程度、服务质量以及可选路由的花费来决定从一个网络中的节点 A 到另一个网络中节点 B 的最佳路径。
4.传输层
该层为两台主机上的应用程序提供端到端的通信。相比之下,网络层的功能是建立主机到主机的通信。传输层有两个传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。其中,TCP是一个可靠的面向连接的协议,UDP是不可靠的或者说无连接的协议。
5.应用层
应用程序收到传输层的数据后,接下来就要进行解读。解读必须事先规定好格式,而应用层就是规定应用程序的数据格式的。它的主要协议有HTTP、FTP、Telnet、SMTP、POP3等。

二、TCP的三次握手与四次挥手

 

打开链接→写请求数据→读响应数据→关闭链接

 

TCP三次握手的过程如下。


• 第一次握手:建立连接。客户端发送连接请求报文段,将 SYN 设置为 1、Sequence Number(seq)为x;接下来客户端进入SYN_SENT(发送)状态,等待服务端的确认。

(第一次握手呢是很重要的,在我们服务器受到黑客攻击的时候,服务器会收到成千上万个的SYN包请求我们的服务器同意和他第一次握手,无论同意还是不同意,都会影响我们服务器的性能,我们就要识别咱们这个SYN包的IP地址是什么同一时间段,发送无数个随机IP的SYN包请求我们的服务器,这个时候我们要意识到,有黑客在攻击我们的服务器)
• 第二次握手:服务器收到客户端的 SYN 报文段,对 SYN 报文段进行确认,设置Acknowledgment Number(ACK)为 x+(seq+1);同时自己还要发送 SYN 请求信息,将SYN设置为1、seq为y。服务端将上述所有信息放到SYN+ACK报文段中,并发送给客户端,此时服务端进入SYN_RCVD(确认状态)状态。
• 第三次握手:客户端收到服务端的SYN+ACK报文段;然后将ACK设置为y+1,向服务端发送ACK报文段,这个报文段发送完毕后,客户端和服务端都进入ESTABLISHED (TCP连接成功)状态,完成TCP的三次握手。当客户端和服务端通过三次握手建立了TCP连接以后,当数据传送完毕,断开连接时就需要进行TCP的四次挥手。其四次挥手如下所示。

(简述:我想连你你同意我在连你(成功

为什么要三次握手呢?

为了防止已失效的连接请求,报文段突然又传到了服务端,产生错误。

解释:报文段已发送,在某个网络节点发生了滞留,导致连接释放,释放后报文才到达另一端。

例如:C端发送SYN报文给S端,连接被释放后,S端菜收到报文并误认为这是C端的新连接,给C端发送SYN+ACK报文,这是无法得到C端回应的,因为连接已无效。

TCP四次挥手的过程如下。


• 第一次挥手:客户端设置seq(客户端)和ACK(服务端),向服务端发送一个FIN(结束)报文段(序列号=x)。此时,客户端进入FIN_WAIT_1(等待)状态,表示客户端没有数据要发送给服务端了。
• 第二次挥手:服务端收到了客户端发送的FIN(结束)报文段,向客户端回了一个ACK报文段。(ACK=X+1),客户端进入了等待,服务端同意了客户端的关闭请求。(这个时候A还不能关闭,因为服务端只是同意了,客户端的关闭)
• 第三次挥手:服务端向客户端发送 FIN 报文段,请求关闭连接,同时服务端进入LAST_ACK(最后确认)状态。
• 第四次挥手:客户端收到服务端发送的FIN报文段,向服务端发送ACK报文段,然后客户端进入TIME_WAIT状态。服务端收到客户端的ACK报文段以后,就关闭连接。此时,客户端等待2MSL(最大报文段生存时间)后依然没有收到回复,则说明服务端已正常关闭,这样客户端也可以关闭连接了。

(简述:四次挥手呢,就是我们客户端发送请求,服务端完事了,然后就要断开连接,但是断开连接并不是那么容易的,只有完成四次挥手呢,我们才能断开连接,(大白话:就是我要关闭了,请求你的同意,我不能先同意呢,我也得先关闭,我同意你先关闭并且知道你你关闭了,我在关闭。)为什么我最后关闭呢,因为如果我是客户端,我要关闭了,你服务端收到我的一条请求这个时候你正在给我发送数据,我是不能擅自关闭的,因为我关闭之后,我就接收不到你这些数据的,就会导致数据丢失)

为什么TCP要四次挥手呢?

TCP协议是一种面向连接的,可靠的,基于字节流的运输层通讯协议。

TCP是全双工模式,主机1请求关闭连接,不在发送数据了,但是可以接收主机2的数据,主机2不在发送数据了。才算关闭,这样减小了丢失数据的风险。

如果有大量的连接,每次在连接、关闭时都要经历三次握手、四次挥手,这很显然会造成性能低下。因此,HTTP有一种叫作keepalive connections的机制,它可以在传输数据后仍然保持连接,当客户端需要再次获取数据时,直接使用刚刚空闲下来的连接而无须再次握手

 

关于位码:位码即tcp标志位,有6种

SYN(synchronous 建立连接)将syn设置为1就说明我们是第一次握手

ACK(acknowledgement 确认)

PSH(push 传送)

FIN(finish 结束)

RST(reset 重置)

URG(urgent 紧急)

 

三、HTTP请求报文

HTTP 报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。一般一个HTTP请求报文由请求行、请求报头、空行和请求数据4个部分组成.

1.请求行


请求行由请求方法、URL字段和HTTP协议的版本组成,格式如下:
Method Request-URI HTTP-Version CRLF其中 Method表示请求方法;Request-URI是一个统一资源标识符;
HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。
HTTP请求方法有8种,分别是GET、POST、HEAD、PUT、DELETE、TRACE、CONNECT、OPTIONS。对于移动开发最常用的就是GETPOST了。
GET:请求获取Request-URI所标识的资源。
POST:在Request-URI所标识的资源后附加新的数据。
HEAD:请求获取由Request-URI所标识的资源的响应消息报头。
PUT:请求服务器存储一个资源,并用Request-URI作为其标识。
DELETE:请求服务器删除Request-URI所标识的资源。
TRACE:请求服务器回送收到的请求信息,主要用于测试或诊断。
CONNECTHTTP 1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项和需求。


2.请求报头


在请求行之后会有0个或者多个请求报头,每个请求报头都包含一个名字和一个值,它们之间用英文冒号“:”分割。


3.请求数据


请求数据不在GET方法中使用,而在POST方法中使用。POST方法适用于需要客户填写表单的场合,与请求数据相关的最常用的请求报头是Content-TypeContent-Length

四、HTTP响应报文

HTTP 的响应报文由状态行、响应报头、空行、响应正文组成。关于响应报头,我们会在后面做统一解释。响应正文是服务器返回的资源的内容。我们先来看看状态行。


状态行


状态行格式如下所示:
HTTP-Version Status-Code Reason-Phrase CRLF其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态码;Reason-Phrase表示状态码的文本描述。状态码由3位数字组成,第一个数字定义了响应的类别,且有以下5种可能取值。
100~199:指示信息,收到请求,需要请求者继续执行操作。
200~299:请求成功,请求已被成功接收并处理。
300~399:重定向,要完成请求必须进行更进一步的操作。
400~499:客户端错误,请求有语法错误或请求无法实现。
500~599:服务器错误,服务器不能实现合法的请求。


常见的状态码如下。


200 OK:客户端请求成功。
400 Bad Request:客户端请求有语法错误,服务器无法理解。
401 Unauthorized:请求未经授权,这个状态码必须和WWWAuthenticate报头域一起使用。
403 Forbidden:服务器收到请求,但是拒绝提供服务。
500 Internal Server Error:服务器内部错误,无法完成请求。
503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。

五、HTTP的消息报头

消息报头分为通用报头、请求报头、响应报头、实体报头等。消息报头由键值对组成,每行一对,关键字和值用英文冒号“:”分隔。


1.通用报头


它既可以出现在请求报头,也可以出现在响应报头中,如下所示。
Date:表示消息产生的日期和时间。
Connection:允许发送指定连接的选项。例如指定连接是连续的;或者指定“close”选项,通知服务器,在响应完成后,关闭连接。
Cache-Control:用于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制)。


2.请求报头


请求报头通知服务器关于客户端请求的信息。典型的请求报头如下所示。
Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
User-Agent:发送请求的浏览器类型、操作系统等信息。
Accept:客户端可识别的内容类型列表,用于指定客户端接收哪些类型的信息。
Accept-Encoding:客户端可识别的数据编码。
Accept-Language:表示浏览器所支持的语言类型。
Connection:允许客户端和服务器指定与请求/响应连接有关的选项。例如,这时为Keep-Alive则表示保持连接。
Transfer-Encoding:告知接收端为了保证报文的可靠传输,对报文采用了什么编码方式。


3.响应报头


用于服务器传递自身信息的响应。常见的响应报头如下所示。
Location:用于重定向接收者到一个新的位置,常用在更换域名的时候。
Server:包含服务器用来处理请求的系统信息,与User-Agent请求报头是相对应的。


4.实体报头


实体报头用来定义被传送资源的信息,其既可用于请求也可用于响应。请求和响应消息都可以传送一个实体。常见的实体报头如下所示。
Content-Type:发送给接收者的实体正文的媒体类型。
Content-Lenght:实体正文的长度。
Content-Language:描述资源所用的自然语言。
Content-Encoding:实体报头被用作媒体类型的修饰符。它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content-Type报头域中所引用的媒体类型,必须采用相应的解码机制。
Last-Modified:实体报头用于指示资源的最后修改日期和时间。
Expires:实体报头给出响应过期的日期和时间。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值