SEQ: 表示初始包序号,随时间变化。就是说我希望你从从这数字开始计数,其实就是确保双方都是本人,不能随便带个序号来都能进行工作,那就乱了
ACK: 表示响应,就是说我成功得到了你给我的内容
PSH: 表示有DATA数据传输
RST: 表示连接重置。
好,进入正题,先看张图吧
看完图可能就豁然开朗了吧。不过,其实我还少说了一部分,这些内容的值是什么呢? 咱们看个建立链接的真实例子(访问百度的抓包)吧!
可以清楚地看到,经过三次tcp握手后,通道建立成功,然后发送了http请求,也侧向验证了传输层服务应用层。
还可以看到每次发送tcp的时候,seq ack这类值都会发生变化,这个是关键,上面说了他们的定义,但是没说为啥要用这些。
这是因为我们要确认连接双方的确定性,进而建立可靠连接。
客户端发送请求连接百度,然后发送带有SYN标志的tcp到服务端,告诉服务端,我想和你连接。
服务端如果没收到,那就算了,如果收到了,就会返回表示接收到了的ACK信号,并发送服务端的SYN与客户端建立连接,这是双向的、可靠地。
如果服务端发送过客户端没收到呢?服务端会定时重新发送,知道成功或超过最大限制未知。简化版心跳机制吧。
客户端收到了服务端发的SYN和ACK,会再次发送代表接收到了的ACK信号,告诉服务端,我ok了
上图中后两次ACK的值为1就代表是响应成功1次。
其实更通俗的来讲,就是下一次的tcp通信要能证明上一次的tcp通信是成功的。
就比如说ack,我第一次请求连接的时候,初始ack肯定为0,然后你发给我的为1,就证明了我第一次请求是成功的,反之亦然,可以自己思考一下,有问题欢迎交流。
到这里可能有人会问,为啥一定是三次呢?因为下一次的tcp通信要能证明上一次的tcp通信是成功的啊。不然你试试两次,看看能不能证明。这是的三次是最小次数,保证效率,三次通信以上理论上都是可以的,但是没必要。
四次挥手断开连接四次挥手其实和上面差不多,不过SYN变成了FIN,用来'触发'断开连接操作。操作其实是一样的。
那为啥不能和创建连接一样,三次不就好了嘛,还效率。
举个可能不算恰当的例子:创建连接是往一个空的容器里加东西,加就完了,反正刚开始是空的。而断开连接在不加东西之后,还需要将容器里的东西清理掉,有始有终。
一图以蔽之:
还不明白,私聊我,我怼怼你!!!
好了,传输层任务完成,应用层启动~
HTTP和HTTPS能说的很多,但是感觉又没啥好说的,随便说说吧就。
首先我们知道https就是http,不过加了一层安全控制: SSL/TLS。
怎么就安全了捏?我们知道http是明文传输的,也无法校验内容的完整性。并且由于是无状态链接,所以也不知道这东西是谁发的,会不会被人改过。
那https的s到底做了啥?
加密!
对称加密就是我们门禁,对,就宾馆的那种。我们可以将要发送的内容保护起来,放到宾馆里,然后通过门禁(密钥)来访问内容。看起来很安全哈。但是如果这个门禁被人偷偷拿走复制了一份,那我们的内容就可以被其他人随意访问了。这是不靠谱的,我们没隐私了,赤裸裸~
非对称加密我们换个方案吧,我们让宾馆提供两张门禁卡,一个公开的,所有人都可以知道,一个是私有的,只有负责人才知道,然后宾馆的房间改为两道门,外面的门可以用公开的门禁打开(公钥加密),里面的门可以用私钥打开(私钥解密),并且里面的门有一个通道,可以让有公钥的人将内容放到房间内。由于里面的门只能用私钥打开,所以只有负责人能够查看这个内容。
这就是非对称加密,使用两个密钥,一个是公开的 - 公钥,一个是私密的 - 密钥。然后我们把公钥散播出去就可以了。