一、HTTP协议定义:HyperText Transfer Protocol 超文本传输协议。无连接、无状态
解决的是:客户端与服务器端请求应答的标准。通常,HTTP客户端发起一个请求,创建一个到服务器制定端口(默认80端口)的TCP链接。HTTP服务器则监听80端口,一旦收到请求,服务器会客户端返回一个状态码,以及请求所需的内容
HTTP工作原理:
1、HTTP客户端向DNS服务器请求解析URL中的域名,获得IP和端口
2、根据IP和端口,与服务器建立TCP链接,服务器接收到TCP请求,发送应答
3、客户端接收到应答,发送HTTP请求数据,该数据作为TCP三次握手中的第三次数据发送,一个请求报文由请求行、请求头部、空行和请求数据4部分组成.
4、服务端接口接收请求数据,处理请求,并返回结果与状态。响应体由:状态行、响应头部、响应正文三部分过程
5、返回结束后,断开TCP连接 (若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;)
6、客户端收到结果与状态后渲染页面
HTTPS的工作原理:
1、客户端发起HTTPS的请求
2、服务端接收客户端请求,返回数字证书相关信息
3、客户端收到服务端响应,验证证书的合法性,生成随机数密码
4、生成握手消息并计算hash值,用随机数对消息进行加密,发送给服务端
5、服务端用私钥进行解密获取随机数,再用随机数解密出握手消息和hash值,与传过来的hash值进行比对。 再用随机数密码加密一段消息给浏览器
6、浏览器解密并获得握手消息的hash值,与服务器传过来的hash值进行比对,成功后,两者建立连接,之后的通信都有浏览器生成的随机密码,并用对称加密算法进行加密
HTTP状态:
1XXX(信息性状态码):请求成功,继续处理
2XXX(成功状态码): 请求成功,处理完成
3XXX(重定向状态码): 请求需进一步处理才能完成
4XXX(客户端错误状态码): 请求出现错误,或不被理解
5XXX(服务端错误状态码): 请求处理过程中出现错误
GET请求和POST请求的区别:
1、GET请求参数放到URL中,有大小限制、POST请求放到Request Body中,理论上没有限制
2、GET请求主要用于从服务器上获取数据,POST请求主要用于向服务器传输数据
3、get安全性非常低,post安全性较高。
计算机网络体系

OSI七层协议:物理层:通过媒介传输比特,(中继器、RJ45 )
数据链路层:将比特组装成帧,点到点的传输(VLAN、交换机)
网络层:负责将数据包的传递与网际互联 (IP)
传输层: 提供端到端的可靠报文传递和错误恢复 (TCP)
会话层: 建立、管理和终止会话
表示层:对数据进行加密、压缩、转换
应用层:允许访问OSI环境的手段
——————————————————————————
二、传输层中的TCP/UDP
TCP:
TCP 是面向连接的、可靠的流协议。流就是指不间断的数据结构,当应用程序采用 TCP 发送消息时,虽然可以保证发送的顺序,但还是犹如没有任何间隔的数据流发送给接收端。TCP 为提供可靠性传输,实行“顺序控制”或“重发控制”机制。此外还具备“流控制(流量控制)”、“拥塞控制”、提高网络利用率等众多功能
UDP:
UDP 是不具有可靠性的数据报协议。细微的处理它会交给上层的应用去完成。在 UDP 的情况下,虽然可以确保发送消息的大小,却不能保证消息一定会到达。因此,应用有时会根据自己的需要进行重发处理。
TCP和UDP的区别:
1、连接方面: TCP面向连接(确认同学对端存在才发生),UDP无连接
2、安全方面:TCP提供可靠的服务,通过TCP链接传送的数据,无差错不丢失不重复按次序到达
UDP,不保证可靠交付
3、传输效率:TCP效率低,UDP传输效率高
4、连接对象数量的区别:TCP链接是一对一,UDP链接支持一对一、一对多、多对一
三次握手:
第一次次握手:客户端将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给服务器端,客户端进入SYN_SENT状态,等待服务器端确认。
第二次握手:服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。
第三次握手:客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务器端,服务器端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。
四次挥手
中断连接端可以是客户端,也可以是服务器端。
第一次次挥手:客户端发送一个FIN=M,用来关闭客户端到服务器端的数据传送,客户端进入FIN_WAIT_1状态。意思是说"我客户端没有数据要发给你了",但是如果你服务器端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据。
第二次挥手:服务器端收到FIN后,先发送ack=M+1,告诉客户端,你的请求我收到了,但是我还没准备好,请继续你等我的消息。这个时候客户端就进入FIN_WAIT_2 状态,继续等待服务器端的FIN报文。
第三次挥手:当服务器端确定数据已发送完成,则向客户端发送FIN=N报文,告诉客户端,好了,我这边数据发完了,准备好关闭连接了。服务器端进入LAST_ACK状态。
第四次挥手:客户端收到FIN=N报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务器端不知道要关闭,所以发送ack=N+1后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。服务器端收到ACK后,就知道可以断开连接了。客户端等待了2MSL后依然没有收到回复,则证明服务器端已正常关闭,那好,我客户端也可以关闭连接了。最终完成了四次握手。
【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假想网络是不可靠的,有可能最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

38万+

被折叠的 条评论
为什么被折叠?



