七层模型,四次模型以及对应层的协议
物理层:传输01比特流。
数据链路层:将01比特流封装成帧,同时对01比特流进行差错校验。
网络层:将数据帧封装成IP数据报,为数据包选择路由。
传输层:提供端对端的连接 TCP,UDP
会话层:解除或建立与别的接点的联系 没有协议
表示层:数据格式化,代码转换,数据加密 没有协议
应用层:文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet
说说TCP三次握手
- 第一次握手,客户端向服务器发起连接请求,SYN=1,代表发起请求,seq=x,代表发送的消息第一个字节的序号为x。
- 第二次握手,服务器向客户端回发接受请求报文,SYN=1,代表接受请求;seq=y,代表发送的第一个字节的序号是y;ACK=1,代表是回复报文;ack=x+1,代表期待收到下一个包的序号为x+1。
- 第三次握手,客户端向服务端回复确认报文,seq=x+1,代表发送的消息的第一个字节的序号是x+1;ACK=1,代表是回应报文;ack=y+1,代表期待收到下一个包的序号是y+1。(这次握手的包不消化序号)
说说TCP四次挥手
TCP是半连接的,因此在释放连接的时候每次只能关闭一边的连接。客户端和服务器端都可以发起关闭连接请求。
- 假如客户端需要关闭连接,那么第一次挥手它会先发送一个终止连接报文,FIN置1,代表终止连接请求;并设置seq为x,代表发送的报文第一个字节的序号为x。
- 第二次挥手,服务器端收到了请求关闭连接的报文之后,回复一个响应报文,ACK置为1,代表响应报文;ack为x+1,代表x+1之前的报文都正确接收,期待收到的下一个报文序号为x+1,seq为y,代表发送的报文第一个字节序号为y。发送完毕之后,客户端到服务器端的发送通道释放了。
- 第三次挥手,等到服务器要发送的报文都发送完了,如果服务器端也要释放连接。需要向客户端发送终止连接报文,FIN置1,ACK置1,ack置x+1,seq置为z。
- 第四次挥手,客户端收到报文之后,回复响应报文,ACK置1,ack置z+1。seq置x+1。服务器收到报文之后,连接释放。客户端需要等待一段时间,如果没有收到服务器端的超时重传报文就释放连接。
说说TCP和UDP的区别
- TCP是面向连接的,需要三次握手建立连接,四次挥手释放连接;依靠校验和,序号,确认应答,拥塞控制,流量控制,超时重传等机制确定数据安全无误码。而UDP是无连接的。只进最大努力交付数据,对数据包的丢失,误码等并不关心。
- TCP只支持单播,而UDP支持单播,多播,广播。
- TCP是面向字节流的,而UDP是面向报文的,直接打包应用层的报文。
- UDP首部开销小,只有八个字节,而TCP首部只是二十字节,最大六十字节。
说说get和post的区别
- 参数存放的位置不同,get放在请求链接后面;而post放在请求体。
- get会缓存数据,而post不会。get会保存浏览记录,而post不会。因此post更安全。
- get使用tomcat的编码方式,tomcat8之后,默认编码方式是utf-8;而post使用web容器的编码方式,默认是iso-8859-1。
- get请求只发送一个数据包,在请求的时候直接将header和data发送过去;而post请求发送两个数据包,先发送header,收到响应码100之后再发送数据。
- get方式的参数有长度限制,而post没有。
- get一般用于获取数据;而post一般用于写入数据。
说说HTTP和HTTPS的区别
- HTTPS使用SSL协议确保安全,里面交换密钥涉及到认证,因此需要到CA申请证书。而HTTP不需要。
- HTTP是超文本传输协议,参数是明文传输的,因此不安全,而HTTPS使用SSL协议,相对安全。
- HTTP使用的端口是80,而HTTPS使用的端口是443.
- HTTP的连接简单,是无状态的,而HTTPS的连接是需要由SSL+HTTP 协议进行加密传输、身份认证的可靠的连接。
说说SSL连接过程
- 第一次握手:携带生成的随机数,支持的加密算法,TLS版本号
- 第二次握手:携带证书(里面有服务器公钥,公钥的摘要,域名),生成的随机数,选中的加密算法,确认支持客户端的版本,服务端椭圆曲线公钥 Server Params
- 第三次握手:①验证证书,利用服务器的 Server Params算出pre-master,然后pre-master和两个随机数生成主密钥。携带客户端椭圆曲线公钥pubkey,以及主密钥,然后用服务端的公钥进行加密,然后发送,通知服务器使用对称加密进行通信。②再发送一个用主密钥将之前发送的消息加密发送给服务器,用来校验生成的主密钥是否正确,同时验证消息是否被篡改。
- 第四次握手:用私钥解密得到客户端的椭圆曲线公钥Client Params,算出pre-master,加上前面两个随机数,算出主密钥。然后解密后面用主密钥加密的消息,验证主密钥以及数据是否被纂改。都没有问题之后就使用协商的密钥进行加密通信。
说说流量控制,拥塞控制
- 流量控制是通过滑动窗口实现的,客户端发送窗口大小根据服务端的接收窗口大小进行调整。接收方每次接收数据都会向发送方发送一个携带接收窗口大小的报文,发送方把发送创建调整为接收窗口大小。同时发送方根据接收方回复的确认序号,将已经确认的报文移出发送窗口。
- 当接收窗口大小为0的时候,会发送一个0窗口报文给发送方。发送方开启一个持续计时器,计时器超时就会发送一个一字节的零窗口探测报文,服务端会将接收窗口大小发送给客户端。如果还是零窗口就继续上述步骤。
- 拥塞控制包含慢开始,拥塞避免,快重传,快恢复。
- 一开始是慢开始,拥塞窗口从1开始,按指数增长;到达慢开始阈值之后就转用拥塞避免算法,变成线性增长,每次加一;当遇到拥塞丢包的时候,就将阈值设置为当前滑动窗口的一半,拥塞窗口重新从1开始。
- 不过如果只是普通的丢包也会误判,因此引入了快重传和快恢复。快重传要求客户端尽快进行重传,而不用等到超时。这也要求服务端在每次收到报文的时候立刻回复确认报文。如果某个报文出现丢失,那么服务端每收到一个新的报文就会回复一次已经确认的报文,发送端连续收到三个相同的确认报文就知道出现了丢包,就立刻重新发送该确认报文序号的下一个报文。服务端直接把中间收到的三个报文也一起进行确认。
- 发送端收到三个相同的确认报文就知道只是个别的报文丢失,不会启动慢开始算法,而是启动快恢复算法。把发送窗口和阈值设置为当前窗口的一半,直接开始拥塞避免算法,线性增长。
cookie和session区别
- 存储位置不同,cookie存放在客户端;session存放在服务端。
- 存储方式不同,cookie只支持字符串;而session支持字符串,整型,map等。
- 存储容量不同,单个cookie容量<=4KB,一个浏览器最多存储20个cookie;而session没有上限。
- 有效期不同,可以通过设置让cookie达成长期保存的效果;而客户端session在浏览器关闭之后,就会自动清除。这个清除是指浏览器找不到之前的session了,并不是指服务端存的session。
- 跨域支持上不同,cookie支持跨域名访问;而session不支持跨域名访问。
TCP粘包是什么?如何解决?
TCP粘包就是接收方接收到好几个包,数据包首尾相连,粘成了一个包。
可以设置特殊标记来代表包头,这样在服务层就可以根据标志来将粘起来的包分开。
也可以在包头记录包的长度,这样在服务层就可以根据长度进行接收,区别不同的包。