七层
应用进程
粘包问题以及如何理解是 TCP 面向字节流协议?
之所以会说 TCP 是面向字节流的协议,UDP 是面向报文的协议,是因为操作系统对 TCP 和 UDP 协议的发送方的机制不同,也就是问题原因在发送方。
先来说说为什么 UDP 是面向报文的协议?
当用户消息通过 UDP 协议传输时,操作系统不会对消息进行拆分,每个 UDP 报文就是一个用户消息的边界,这样接收方在接收到 UDP 报文后,读一个 UDP 报文就能读取到完整的用户消息。由于UDP有消息保护边界,不会发生粘包拆包问题
你可能会问,如果收到了两个 UDP 报文,操作系统是怎么区分开的?
操作系统在收到 UDP 报文后,会将其插入到队列里,队列里的每一个元素就是一个 UDP 报文,这样当用户调用 recvfrom() 系统调用读数据的时候,就会从队列里取出一个数据,然后从内核里拷贝给用户缓冲区。
再来说说为什么 TCP 是面向字节流的协议?
当用户消息通过 TCP 协议传输时,消息可能会被操作系统分组成多个的 TCP 报文,也就是一个完整的用户消息被拆分成多个 TCP 报文进行传输。
这时,接收方的程序如果不知道发送方发送的消息的长度,也就是不知道消息的边界时,是无法读出一个有效的用户消息的,因为用户消息被拆分成多个 TCP 报文后,并不能像 UDP 那样,一个 UDP 报文就能代表一个完整的用户消息。
因此,我们不能认为一个用户消息对应一个 TCP 报文,正因为这样,所以 TCP 是面向字节流的协议。
------
tcp是基于字节流传输的,使用tcp协议传输的数据是无边界的。。。
解决方法:
固定包大小(浪费空间),
设置标志位:
我们可以在两个用户消息之间插入一个特殊的字符串,这样接收方在接收数据时,读到了这个特殊字符,就把认为已经读完一个完整的消息。
自定义消息结构:
我们可以自定义一个消息结构,由包头和数据组成,其中包头包是固定大小的,而且包头里有一个字段来说明紧随其后的数据有多大。
getpost
使用场景上
- 在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;
- Get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;
时间消耗上:
Get和Post还有一个重大区别:
Get产生一个TCP数据包;Post产生两个TCP数据包。
对于Get方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据),而对于Post,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
比如说:Get只需要汽车跑一趟就把货送到了,而Post得跑两趟,第一趟,先去和服务器打个招呼“嗨,我等下要送一批货来,你们打开门迎接我”,然后再回头把货送过去。由于Post需要两步,时间上消耗的要多一点,所以Get比Post更有效率。
http缓存
对称加密 在加密和解密时使用同一密钥得加密方式
【对称加密与非对称加密】-- 概念、图示、优缺点_对称加密和非对称加密的优缺点-CSDN博客
非对称加密:
加密和解密使用不同的秘钥,一把公开的公钥,一把私有的私钥。公钥加密的信息只有私钥才能解密,私钥加密的信息只有公钥才能解密。
服务端有公钥和私钥两把钥匙 私钥只有自己有 把公钥发给对方 对方用公钥对数据进行加密 发回给服务端 服务端用私钥进行解密 公钥加密 私钥解密
SSL/TLS握手过程
握手过程:首先客户端香服务端发起clienthello请求 包含了客户端支持的的tls版本 ,支持的加密套件和第一个随机数,服务端收到后会发出serverhello响应,包含了确认的tls版本,确认的加密套件和第二个随机数,并把数字证书发送给对方,客户端首先用CA的公钥来确认数字证书是否正确,正确的话从数字证书中取出服务器的公钥,然后生成第三个随机数,之后使用服务器的公钥对第三个随机数进行加密,之后发送给对方,服务端用自己的私钥将加密的随机数进行解密,得到第三个随机数,之后客户端和服务端通过这三个随机数生成会话密钥,之后客户端和服务端就会通过这个会话密钥进行对称加密。
http1.1 http1.0
Host 头处理
不同域名的网站可以共用相同的IP地址和端口。发送Host就是为了要访问哪个域名对应的网站。
三次握手
流量控制
Linux下非阻塞socket详解:实现高效网络通信 (linux非阻塞socket) – 后浪云 (idc.net)
如何应对TCP半连接队列和TCP全连接队列满的情况?——拆解大厂面试题
全连接队列和半连接队列
tcp标志位
cookie和session
http常见
3.1 HTTP 常见面试题 | 小林coding (xiaolincoding.com)
大量closewait
finwait2对应 timewait
面试八股(六) 腾讯面试真题:close_wait状态的原因是什么?该怎么办? (qq.com)
tcp udp使用相同端口
(9 封私信 / 52 条消息) 字节一面:TCP 和 UDP 可以使用同一个端口吗? - 知乎 (zhihu.com)
DNS
可靠的udp
quic
字节一面:如何用 UDP 实现可靠传输?-腾讯云开发者社区-腾讯云 (tencent.com)
quic和udt
TCP 层为了保证数据的有序性,只有在处理完有序的数据后,滑动窗口才能往前滑动,否则就停留。
tcp连接异常问题
被鹅厂面怕了:TCP 连接异常的问题 - 知乎 (zhihu.com)
保活机制 超时重传。。
4个实验,彻底搞懂TCP连接的断开 - 捉虫大师 - 博客园 (cnblogs.com)