万字长文,一文搞懂TCP/IP和HTTP、HTTPS

TCP/IP概念

TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指可以在多个不一样网络间实现信息传输的协议簇。TCP/IP协议不只仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇,同时是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。面试

个人理解:  互联网中的设备要相互通讯,必须基于相同的方式,好比由哪一方发起通信,使用什么语言进行通信,怎么结束通信这些都要事先肯定,不一样设备之间的通信都须要一种规则,咱们将这种规则成为协议。浏览器

TCP/IP 的分层管理图

TCP/IP协议中最重要的特色就是分层。由上往下分别为 应用层,传输层,网络层,数据链路层,物理层。固然也有按不一样的模型分为4层或者7层的。

为何要分层呢?在设计的角度来说变得灵活了,当某一层须要修改时,只须要拿掉对相应的层,实现可拔插,无需变更全部层。对于使用者来说,屏蔽了底层复杂的传输过程。缓存

应用层

TCP/IP模型将OSI参考模型中的会话层和表示层的功能合并到应用层实现。这一层主要的表明有DNS域名解析/http协议安全

传输层

在TCP/IP模型中,传输层的功能是使源端主机和目标端主机上的对等实体能够进行会话。在传输层定义了两种服务质量不一样的协议。即:传输控制协议TCP和用户数据报协议UDP.服务器

网络层

网络层是整个TCP/IP协议栈的核心。它的功能是把分组发往目标网络或主机。同时,为了尽快地发送分组,可能须要沿不一样的路径同时进行分组传递。所以,分组到达的顺序和发送的顺序可能不一样,这就须要上层必须对分组进行排序。网络层定义了分组格式和协议,即IP协议(Internet  Protocol )。微信

物理层

该层负责 比特流在节点之间的传输,即负责物理传输,这一层的协议既与链路有关,也与传输的介质有关。通俗来讲就是把计算机链接起来的物理手段。网络

数据链路层

控制网络层与物理层之间的通讯,主要功能是保证物理线路上进行可靠的数据传递。为了保证传输,从网络层接收到的数据被分割成特定的可被物理层传输的帧。帧是用来移动数据结构的结构包,他不只包含原始数据,还包含发送方和接收方的物理地址以及纠错和控制信息。其中的地址肯定了帧将发送到何处,而纠错和控制信息则确保帧无差错到达。若是在传达数据时,接收点检测到所传数据中有差错,就要通知发送方重发这一帧。数据结构

UDP 和 TCP 的特色:
  • 用户数据报协议 UDP(User Datagram Protocol):无链接;尽最大努力的交付;面向报文;无拥塞控制;支持一对1、一对多、多对1、多对多的交互通讯;首部开销小(只有四个字段:源端口、目的端口、长度、检验和)。UDP是面向报文的传输方式是应用层交给UDP多长的报文,UDP发送多长的报文,即一次发送一个报文。所以,应用程序必须选择合适大小的报文。性能

  • 传输控制协议 TCP(Transmission Control Protocol):面向链接;每个TCP链接只能是点对点的(一对一);提供可靠交付服务;提供全双工通讯;面向字节流。应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序当作是一连串的无结构的字节流。TCP有一个缓冲,当应该程序传送的数据块太长,TCP就能够把它划分短一些再传送。网站

UDP的首部格式:

图片来源于网络

用户数据报有两个字段:数据字段和首部字段,数据字段很简单,只有8个字节,由四个字段组成,每一个字段的长度都是两个字节。各字段意义以下:

  1. 源端口: 源端口号,在须要给对方回信时使用。不须要是可全用0.

  2. 目的端口号: 这在终点交付报文时必须使用。

  3. 长度:  用户数据报UDP的长度,最小为8(仅首部)。

  4. 校验和: 用于校验用户数据报在传输过程是否出错,出错则丢弃该报文。

TCP报文首部格式:
图片来源于网络

源端口和目的端口: 各占两个字节,分别写入源端口号和目的端口号。
序号 : 占4个字节;用于对字节流进行编号,例如序号为 301,表示第一个字节的编号为 301,若是携带的数据长度为 100 字节,那么下一个报文段的序号应为 401。
确认号 : 占4个字节;指望收到的下一个报文段的序号。例如 B 正确收到 A 发送来的一个报文段,序号为 501,携带的数据长度为 200 字节,所以 B 指望下一个报文段的序号为 701,B 发送给 A 的确认报文段中确认号就为 701。
数据偏移 : 占4位;指的是数据部分距离报文段起始处的偏移量,实际上指的是首部的长度。
确认 ACK : 当 ACK=1 时确认号字段有效,不然无效。TCP 规定,在链接创建后全部传送的报文段都必须把 ACK 置 1。
同步 SYN :在链接创建时用来同步序号。当 SYN=1,ACK=0 时表示这是一个链接请求报文段。若对方赞成创建链接,则响应报文中 SYN=1,ACK=1。
终止 FIN : 用来释放一个链接,当 FIN=1 时,表示此报文段的发送方的数据已发送完毕,并要求释放链接。
窗口 : 占2字节;窗口值做为接收方让发送方设置其发送窗口的依据。之因此要有这个限制,是由于接收方的数据缓存空间是有限的。
检验和: 占2个字节;检验和字段检验的范围包括首部和数据这两个部分。在计算检验和时,在TCP报文段的前面加上12字节的伪首部。
套接字: TCP链接的端点叫作套接字或插口。端口号拼接到IP地址即构成了套接字。

面试灵魂拷问

TCP的三次握手与四次挥手
  1. 第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。

  2. 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求创建链接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认链接请求,Server进入SYN_RCVD状态。

  3. 第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,若是正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,若是正确则链接创建成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间能够开始传输数据了。

为何要进行三次握手呢?  
第三次握手是为了防止失效的链接请求到达服器,让服务器错误打开链接。客户端发送的链接请求若是在网络中滞留,那么就会隔很长一段时间才能收到服务器端发回的链接确认。客户端等待一个超时重传时间以后,就会从新请求链接。可是这个滞留的链接请求最后仍是会到达服务器,若是不进行三次握手,那么服务器就会打开两个链接。若是有第三次握手,客户端会忽略服务器以后发送的对滞留链接请求的链接确认,不进行第三次握手,所以就不会再次打开链接。

若是此时变成两次挥手行不行?
举个打电话的例子,好比:
第一次握手:A给B打电话说,你能够听到我说话吗?
第二次握手:B收到了A的信息,而后对A说:我能够听获得你说话啊,你能听获得我说话吗?
第三次握手:A收到了B的信息,而后说能够的,我要给你发信息啦!
结论:
在三次握手以后,A和B都能肯定这么一件事:我能听到你,你也能听到我。这样,就能够开始正常通讯了。若是是两次,那将没法肯定。

当数据传送完毕,断开链接就须要进行TCP的四次挥手:

  1. 第一次挥手,客户端设置seq和 ACK ,向服务器发送一个 FIN(终结)报文段。此时,客户端进入 FIN_WAIT_1
    状态,表示客户端没有数据要发送给服务端了。

  2. 第二次挥手,服务端收到了客户端发送的 FIN 报文段,向客户端回了一个 ACK 报文段。

  3. 第三次挥手,服务端向客户端发送FIN 报文段,请求关闭链接,同时服务端进入 LAST_ACK 状态。

  4. 第四次挥手,客户端收到服务端发送的 FIN 报文段后,向服务端发送 ACK 报文段,而后客户端进入 TIME_WAIT状态。服务端收到客户端的 ACK 报文段之后,就关闭链接。此时,客户端等待2MSL(指一个片断在网络中最大的存活时间)后依然没有收到回复,则说明服务端已经正常关闭,这样客户端就能够关闭链接了。

    四次挥手


最后完整的过程图


为何要四次挥手?

客户端发送了 FIN 链接释放报文以后,服务器收到了这个报文,就进入了 CLOSE-WAIT 状态。这个状态是为了让服务器端发送还未传送完毕的数据,传送完毕以后,服务器会发送 FIN 链接释放报文。

HTTP持久链接

若是有大量的链接,每次在链接,关闭都要经历三次握手,四次挥手,这显然会形成性能低下。所以。Http 有一种叫作 长链接(keepalive connections) 的机制。它能够在传输数据后仍保持链接,当客户端须要再次获取数据时,直接使用刚刚空闲下来的链接而无需再次握手。

HTTP和HTTPS

什么是HTTP?

超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据,互联网上应用最为普遍的一种网络协议,全部的WWW文件都必须遵照这个标准。设计HTTP的初衷是为了提供一种发布和接收HTML页面的方法。

HTTP特色:

  1. 无状态:协议对客户端没有状态存储,对事物处理没有“记忆”能力,好比访问一个网站须要反复进行登陆操做。

  2. 无链接:HTTP/1.1以前,因为无状态特色,每次请求须要经过TCP三次握手四次挥手,和服务器从新创建链接。好比某个客户机在短期屡次请求同一个资源,服务器并不能区别是否已经响应过用户的请求,因此每次须要从新响应请求,须要耗费没必要要的时间和流量。

  3. 基于请求和响应:基本的特性,由客户端发起请求,服务端响应。

  4. 简单快速、灵活。

  5. 通讯使用明文、请求和响应不会对通讯方进行确认、没法保护数据的完整性。

HTTP报文组成:

  1. 请求行:包括请求方法、URL、协议/版本

  2. 请求头(Request Header)

  3. 请求正文

  4. 状态行

  5. 响应头

  6. 响应正文


HTTP的缺点

  1. 通讯使用明文(不加密),内容可能会被窃听。

  2. 不验证通讯方的身份,所以有可能遭遇假装。

  3. 没法证实报文的完整性,因此有可能已遭篡改。

什么是HTTPS?

HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,所以加密的详细内容就须要SSL。
HTTPS协议的主要做用能够分为两种:一种是创建一个信息安全通道,来保证数据传输的安全;另外一种就是确认网站的真实性。


HTTPS 并不是是应用层的一种新协议。只是 HTTP 通讯接口部分用SSL(Secure Socket Layer)和 TLS(Transport Layer Security)协议代替而已。一般,HTTP 直接和 TCP 通讯。当使用 SSL时,则演变成先和 SSL通讯,再由 SSL和 TCP 通讯了。简言之,所谓 HTTPS,其实就是身披SSL协议这层外壳的 HTTP。

HTTPS通信方式:

  1. 客户使用https的URL访问Web服务器,要求与Web服务器创建SSL链接。

  2. Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。

  3. 客户端的浏览器与Web服务器开始协商SSL链接的安全等级,也就是信息加密的等级。

  4. 客户端的浏览器根据双方赞成的安全等级,创建会话密钥,而后利用网站的公钥将会话密钥加密,并传送给网站。

  5. Web服务器利用本身的私钥解密出会话密钥。

  6. Web服务器利用会话密钥加密与客户端之间的通讯。

为何HTTPS安全

  1. SSL不只提供加密处理,加密方式为混合加密。

  2. SSL并且还使用了一种被称为证书的手段,可用于肯定方。证书由值得信任的第三方机构颁发,用以证实服务器和客户端是实际存在的。另外,伪造证书从技术角度来讲是异常困难的一件事。因此只要可以确认通讯方(服务器或客户端)持有的证书。


加密方法

对称加密:
加密和解密同用一个密钥的方式称为共享密钥加密(Common keycrypto system),也被叫作对称密钥加密.

对成加密的方式效率比较低,加密速度慢。另外对称加密存在安全隐患的问题,堆成加密的密钥必需要传到对方对方才能解密,要是对方在密钥传输的过程获取到密钥,那不是密钥失去了加密的意义,因此彻底使用对称加密也是不安全的。

非对称加密:
公开密钥加密使用一对非对称的密钥。一把叫作私有密钥(private key),另外一把叫作公开密钥(public key)。顾名思义,私有密钥不能让其余任何人知道,而公开密钥则能够随意发布,任何人均可以得到。公钥加密,私钥解密
使用公开密钥加密方式,发送密文的一方使用对方的公开密钥进行加密处理,对方收到被加密的信息后,再使用本身的私有密钥进行解密。

那么非对称个加密就必定安全吗?非对称加密也不安全,为何呢?由于存在中间伪造公钥和私钥,假如在公钥传给对方的时候,有人获取到公钥,虽然她不能用你的公钥作什么,可是它截获公钥后,把本身伪造的公钥发送给对方,这样对方获取的就不是真正的公钥,当对方用公钥进行加密文件,再将文件发送给对方,这样即便截获人没有获取到真正的私钥,可是加密时的公钥是截获人的,他获取到加密文件,只须要用本身的私钥进行解密就成功获取到文件了。

混合加密机制(对称加密与非对称加密结合的方式)
顾名思义也就是对称加密和非对称加密的方式相结合。


如何证实公开没要自己的真实性。由于在公开秘钥传输的过程当中,可能真正的公开秘钥已经被攻击者替换掉了。

为了解决上述问题,因而除了CA认证证书。服务器将CA证书发送给客户端,以进行公开密钥加密方式通讯。接到证书的客户端可以使用数字证书认证机构的公开密钥,对那张证书上的数字签名进行验证,一旦验证经过,客户端即可明确两件事:
一,认证服务器的公开密钥的是真实有效的数字证书认证机构。
二,服务器的公开密钥是值得信赖的。

那么公开密钥如何交接给客户端是一件很是重要的事,所以多数浏览器开发商发布版本时,会事先在内部植入经常使用认证机关的公开密钥,这样就确保公钥是使用认证机构的公钥避免了公钥伪造的过程,进而确保了安全。


本文分享自微信公众号 - 非科班的科班(LDCldc123095)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索