HTTP请求流程

HTTP请求流程,包括TCP的连接,http的响应等

HTTP请求流程1.域名解析2.建立TCP连接3.发起http请求4.响应http请求TCP三次握手5.断开TCP连接四次挥手第一次握手 SYN=1,ACK=0第二次握手 SYN=1,ACK=1第三次握手 SYN=0,ACK=11.请求行2.请求头3.请求体1.请求方法2.请求URL3.http协议及版本包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息它将一个页面表单中的组件值通过param1=value1&param2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于“/chapter15/user.html? param1=value1&param2=value2”的方式传递请求参数。 此为详细结构图1.响应行2.响应头3.响应体1.http协议及版本2.状态码及状态描述由多个属性组成请求的响应数据状态码1xx状态码2xx状态码3xx状态码4xx状态码5xx告诉客户端,请求收到,正在处理处理成功重定向到其它地方。它让客户端再发起一个请求以完成整个处理处理发生错误,责任在客户端,如客户端的请求一个不存在的资源,客户端未被授权,禁止访问等处理发生错误,责任在服务端,如服务端抛出异常,路由出错,HTTP版本不支持等补充TCP/IP、Http、Socket的区别TCP粘包,拆包1.TPC/IP协议是传输层协议,主要解决数据如何在网络中传输2.socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API)。Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口,比如create、listen、connect、accept、send、read和write等等3.http协议对应的是应用层,是建立在TCP协议之上的一种应用粘包拆包接收端收到的数据包包含了发送端发送的两个数据包接收端收到了两个数据包,但是这两个数据包是不完整的发生的原因:1.要发送的数据大于TCP发送缓存区剩余空间大小,将会发生拆包2.待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包3.要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包4.接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包解决方法2.数据包之间设置边界,如添加特殊符号TCP与UDPTCPUDPUDP是基于报文发送的,从UDP的帧结构可以看出,在UDP首部采用了16bit来指示UDP数据报文的长度,因此在应用层能很好的将不同的数据报文区分开,从而避免粘包和拆包的问题TCP是基于字节流的,虽然应用层和TCP传输层之间的数据交互是大小不等的数据块,但是TCP把这些数据块仅仅看成一连串无结构的字节流,没有边界MSS和MTUTCP抓包发现,当一次发送数据较大时,下层会把数据分成多个TCP包进行发送,每次发送1448字节的数据(MTU)1500字节MTU=1518(以太网最大数据帧)-14(以太网帧头)-4(以太网帧尾CRC校验)MSS 1460字节定义:TCP数据包每次能够传输的最大量MSS=1500(MTU)-20(IP头)-20(TCP头)总结:三次握手的建立连接是一个同步的过程,交换初始序列号,保证后续的每一个字节的可靠传输客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手