详谈HTTP/TCP/HTTPS协议

147 阅读10分钟

HTTP协议

  • OSI (网络参考模型)
  • TCP/IP 协议族

http的请求报文

http请求报文.png

  • 请求行

    • 是请求方法,GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。
    • 为请求对应的URL地址,它和报文头的Host属性组成完整的请求URL。
    • 是协议名称及版本号。
  • 请求头

    • 是HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。

    • 与缓存相关的规则信息,均包含在header中

  • 请求体

    • 是报文体,它将一个页面表单中的组件值通过/chapter15/user?param1=value1&param2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于/chapter15/user?param1=value1&param2=value2的方式传递请求参数。

HTTP请求报文头属性

  1. Accept

    请求报文可通过一个“Accept”报文头属性告诉服务端 客户端接受什么类型的响应。 如下报文头相当于告诉服务端,俺客户端能够接受的响应类型仅为纯文本数据啊,你丫别发其它什么图片啊,视频啊过来,那样我会歇菜的

     Accept:text/plain 
    

    Accept属性的值可以为一个或多个MIME类型的值(描述消息内容类型的因特网标准, 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据)

  2. cookie

    客户端的Cookie就是通过这个报文头属性传给服务端的哦!如下所示:

     Cookie: $Version=1; Skin=new;jsessionid=5F4771183629C9834F8382E23 
    

    服务端是怎么知道客户端的多个请求是隶属于一个Session呢?注意到后台的那个jsessionid = 5F4771183629C9834F8382E23木有?原来就是通过HTTP请求报文头的Cookie属性的jsessionid的值关联起来的!(当然也可以通过重写URL的方式将会话ID附带在每个URL的后面哦)。

  3. Referer

    表示这个请求是从哪个URL过来的,假如你通过google搜索出一个商家的广告页面,你对这个广告页面感兴趣,鼠标一点发送一个请求报文到商家的网站,这个请求报文的Referer报文头属性值就是www.google.com

  4. Cache-Control

    对缓存进行控制,如一个请求希望响应返回的内容在客户端要被缓存一年,或不希望被缓存就可以通过这个报文头达到目的。

http的响应报文

http响应报文.png

  • 响应行

    • 报文协议及版本
    • 状态码及状态描述
  • 响应头

    • 响应报文头,也是由多个属性组成
  • 响应体

    • 响应报文体,即我们真正要的“干货”

常见的HTTP响应报文头属性

  1. Cache-Control

    响应输出到客户端后,服务端通过该报文头属告诉客户端如何控制响应内容的缓存。

    常见的取值有private、public、no-cache、max-age,no-store,默认为private。

    private客户端可以缓存
    public客户端和代理服务器都可缓存(前端的同学,可以认为public和private是一样的)
    max-age=xxx缓存的内容将在 xxx 秒后失效
    no-cache需要使用对比缓存来验证缓存数据
    no-store所有内容都不会缓存

    默认为private,缓存时间为31536000秒(365天)也就是说,在365天内再次请求这条数据,都会直接获取缓存数据库中的数据,直接使用。

  2. ETag

    一个代表响应服务端资源(如页面)版本的报文头属性,如果某个服务端资源发生变化了,这个ETag就会相应发生变化。它是Cache-Control的有益补充,可以让客户端“更智能”地处理什么时候要从服务端取资源,什么时候可以直接从缓存中返回响应。

  3. Location

    我们在JSP中让页面Redirect到一个某个A页面中,其实是让客户端再发一个请求到A页面,这个需要Redirect到的A页面的URL,其实就是通过响应报文头的Location属性告知客户端的,如下的报文头属性,将使客户端redirect到iteye的首页中:

     Location: http://www.iteye.com  
    
  4. Set-Cookie

    服务端可以设置客户端的Cookie,其原理就是通过这个响应报文头属性实现的:

     Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1  
    

cookie机制

客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

Cookie的maxAge决定着Cookie的有效期,单位为秒(Second)。Cookie中通过getMaxAge()方法与setMaxAge(int maxAge)方法来读写maxAge属性。

如果maxAge属性为正数,则表示该Cookie会在maxAge秒之后自动失效。

如果maxAge为负数,则表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效。

如果maxAge为0,则表示删除该Cookie。

Cookie并不提供修改、删除操作。如果要修改某个Cookie,只需要新建一个同名的Cookie,添加到response中覆盖原来的Cookie。

如果要删除某个Cookie,只需要新建一个同名的Cookie,并将maxAge设置为0,并添加到response中覆盖原来的Cookie。

 Cookie cookie = new Cookie("username","helloweenvsfei");   // 新建Cookie
 cookie.setMaxAge(0);                                       // 设置生命周期为0,不能为负数
 response.addCookie(cookie);                                // 必须执行这一句 输出到客户端

TCP协议

  1. TCP连接: 四元组[ 源地址,源端口,目的地址,目的端口 ]

  2. 确立连接:TCP三次握手

    a.同步通信双方初始系列号( ISN,inittial sequence number )

    b. 协商TCP通信参数(MSS,窗口信息,指定效验和算法)

如何进行握手?

TCP的三次握手.png

TCP的三次握手2.png

TCP: 四次握手

TCP的四次握手.png

A: 发送FIN数据包,代表A不在发送数据

B: 收到请求,开始应答,避免了A重新发送FIN重试(应答机制)

B: 处理完数据后关闭,关闭连接,及发送FIN请求

A: 收到请求后发送ACK答应,B服务可以释放连接

等待 2MSL后释放连接

  1. 防止报文丢失,导致B重新发送FIN
  2. 防止滞留在网络中的报文,B服务可以释放连接

字节流的协议

字节流协议.png

数据可靠性传输

停止等待协议:

停止等待协议.png

重传机制

  1. ack报文丢失

ack报文丢失.png

  1. 请求报文丢失

请求报文丢失.png

滑动窗口协议与累计确认(延时ack)

滑动窗口大小通过tcp三次握手和对端协商,且受网络情况影响

滑动窗口协议.png

HTTPS协议

HTTPS

由于HTTP天生 “明文” 的特点,整个传输过程完全透明,任何人都能够在链路中截获、修改或者伪造请求 / 响应报文,数据不具有可信性。

因此就诞生了为安全而生的HTTPS协议

使用HTTPS时,所有的HTTP请求和响应在发送到网络之前,都要进行加密。

HTTPS协议.png

SSL/TLS

SSL和TLS都是加密协议,用于通过加密计算机网络上的通信来提高安全性。SSL(RFC规范)代表安全套接字层,而TLS(RFC规范)代表传输层安全。TLS是SSL3.0的后继者,现已成为标准。虽然SSL一词仍然占主导地位,但大多数人在谈论SSL时实际上指的是TLS,因为SSL的公共版本早已被弃用。因此,如今不再只有一张SSL证书或一张TLS证书。事实上,所有的“SSL证书”实际上都是SSLTLS证书。SSLTLS可用于各种应用程序,包括通过以下方式保护数据:

  • HTTPS
  • FTPS
  • SMTP等

加密协议必须遵守某些要求才能被认为是安全的。最终,SSL和TLS协议都提供以下一项或多项属性:

  • 由于加密,连接是私密的。
  • 可以使用公钥加密技术来验证对等方的身份。
  • 每条传输的消息都包含消息完整性检查,以确保连接可靠。

SSL和TLS加密协议都旨在实现相同的目标-提高客户端和服务器之间的网络安全性。下一节将解释这些协议如何实现这一点。

摘要算法

摘要算法,也称为哈希算法或散列算法,是一种通过一系列的计算方法和规则,将输入的任意长度的数据转化成固定长度的返回值,这个值被称为hash值(哈希值)。摘要算法的主要特点包括压缩性、容易计算、抗修改性、强抗碰撞性以及不可逆性。它们在密码学中扮演着重要角色,用于数据完整性校验、数字签名等。主流的摘要算法包括‌MD5、‌SHA-1、‌SHA-2和‌SHA-3等,其中MD5和SHA-1已被证明存在安全漏洞,而SHA-2和SHA-3则提供了更高的安全性。

  • MD5:生成128位固定长度的hash值,曾被广泛使用但已被破解。
  • SHA-1:生成160位固定长度的hash值,同样存在安全漏洞。
  • SHA-2:包括224、256、384、512位的hash值,提供了更高的安全性。
  • SHA-3:全新的算法和标准,提供了更高的安全性和随机性。

摘要算法的计算流程通常包括补位、分组加密等步骤,以确保输出的hash值具有足够的随机性和抗碰撞性。在实际应用中,摘要算法常与非对称加密算法一起使用,以提高数据传输的安全性

加密算法

1、对称秘钥加密算法

编、解码使用相同的秘钥算法,如(AES,RC4,ChaCha20)

对称加密:xor (相同为0 反之为1)

1110101010111010 原文 0101101101010101 秘钥

1011000111101111 密文(原文和秘钥 异或运算 得到密文) 0101101101010101 秘钥

1110101010111010 原文(密文和秘钥 异或运算 得到原文)

2、非对称秘钥加密算法

它两个秘钥,一个叫 “公钥”,一个叫 “私钥”。两个秘钥是不同的,公钥是公开给任何人使用,而私钥必须严格保密。非对称加密可以解决 “秘钥交换” 的问题,网址秘钥保管私钥,在网上任意发分公钥,你想要登录网站只要用公钥加密就行了,密文只能有私钥持有者才能解密。而黑客因为没有私钥,所以无法破解密文。非对称秘钥加密系统通常需要大量的数学运算,比较慢。如(DH、DSA、RSA、ECC)

非对称秘钥加密算法.png

非对称加密: 使用公钥加密 使用私钥解密 使用私钥加密 使用公钥解密

身份验证

非对称秘钥加密算法2.png

结语

文章中如果有什么不对的地方欢迎各位大佬指正

非常感谢你花时间阅读我这篇略显青涩的文章。作为一名新人作者,我深知自己还有很多需要学习和提升的地方。你的每一次阅读、点赞和分享,都是对我莫大的鼓励。

好了,这就是今天的全部内容了。我们下次再见!