TCP,UDP的区别
UDP传送数据之前,不需要先建立连接,远程主机收到UDP报文后,也不需要确认。所以效率比较高,但不安全,一般用于及时通信,如QQ语音视频,直播等。
TCP传送数据之前必须先建立连接,数据传送结束后释放连接,数据传递时有确认,窗口,重传,拥塞控制。安全性好,但效率低,一般用于文件传输,发送和接收邮件,远程登录等场景。
TCP概述
TCP是一个连接对象,连接对象有两个断点。两端点叫套接字,套接字=IP地址+端口号
在浏览器中输入url地址 ->> 显示主页的过程
1.浏览器通过DNS查找域名对应的IP地址,DNS先会在浏览器缓存(本地域名)中查找,查找不到,再依次到路由器缓存(根域名服务器),DNS缓存(顶级域名服务器)中查找。
2.找到IP地址后,与服务器建立TCP连接发送数据,发送数据在网络层使用IP协议。
3.建立连接后,发送HTTP请求
4.服务器处理请求并返回HTTP报文
5.浏览器解析HTML文件构建DOM树,CSS构建渲染树渲染页面
6.连接结束
DNS协议:根据域名获取IP
TCP:与服务器建立TCP连接
IP:建立TCP连接时,需要发送数据,发送数据在网络层使用IP协议
OSPF:开放式最短路径优先,路由器根据IP地址选择传出路径
ARP:路由器与服务器通讯时,需要将IP地址转换为MAC地址,使用ARF协议。
HTTP:在TCP建立完成后,使用HTTP协议访问网页。
各种协议与HTTP协议的联系
OSI七层模型
上层:
应用层:比如各种电商平台提供的程序和协议,Web用的HTTP协议,文件传出的FTP协议 。
表示层:把传输的数据压缩,解压,和加密,为应用层提供语法选择和转换(处理数据,发送的QQ图片在传送前在后台进行编码加墨和压缩)
会话层:建立,管理和终止表示层实体之间的会话连接。(确定应用层之间会话的时间和数量,图片是否发送,发送失败是否重传,接收成功告诉你发送成功) HTTP协议
中间层:
传输层:通过TCP/UDP协议建立通信,选择的快递公司协议。TCP协议 IP协议
下层:数据都在网络内的传递,与操作用户再没关系
网络层:路由器根据IP地址选择传输路径,分拨。 OSPF(开放式最短路径优先)协议 ARF协议 IP地址转换为MAC地址 IP协议
网络接口层:
数据链路层:交换机 根据Mac物理地址进行数据传输
物理作用层:数据的实时传输的光纤,网线
协议间的联系
HTTP协议 客户端段生成HTTP请求报文给服务器,服务器处理HTTP请求。拿出请求头请求体的内容
TCP协议 传送数据协议,将HTTP请求报文分割成多个报文段传给对方,对方收到后,按原来的顺序重组请求报文
IP协议: 搜索对方地址,一边中转一边传
HTTP和HTTPS的区别
HTTP是不安全的,是明文的,HTTPS使用SSL/TLS协议进行了加密。
默认端口也不同,http是80,https是443
TCP三次握手,四次挥手
什么是三次握手:
客户端向服务端发送一个含有同步序列号的标志位SYN,向服务端请求建立连接。客户端通过SYN告诉服务端,我想和你通信,你用这个作为即使数据段来回应我。
服务端收到请求后,向客户端发送一个带有确认应答(ACK)和同步序列号(SYN)标志的数据段。告诉客户端:我收到你的请求了,可以传输数据了。
服务端收到这个数据后,在发送一个ACK标志的确认应答,确认已经收到服务端的回复,要开始传输数据了。
为什么是3次?
第一次:客户端发送网络数据包,服务端收到了,服务端知道客户端有正常的发送数据,服务端有正常的接收数据能力。
第二次:服务端发送网络数据包,客户端收到了。客户端知道服务端有正常的接收和回复能力,客户端有正常的发送和接收能力。但此时服务端不知道客户端有正常的接收能力
因此需要第三次客户端给服务端在发送一个确认接收请求,让服务端直到客户端有正常的接收请求。
如果是两次握手,会出现:
两次握手如果有丢包造成建立多余的失效连接。
客户端向服务端发送数据包请求连接,但因网络原因很慢一直没有等到服务端的确认消息,客户端再次发送一个数据包请求连接,这次服务器收到并回复,客户端收到确认后,发送数据,完成后断开连接。若客户端断开连接后,服务端收到了客户端的第一个请求,发送确认消息给客户端,两次握手建立了连接,但这是失效的连接,失效连接导致资源浪费。如果是三次握手,需要客户端发送确认消息才可以,而由于客户端此时不会回复,服务端接收不到消息就不会建立连接。
为什么要传回SYN
传了 SYN,为啥还要传 ACK
因为SYN是发送通道没有问题的标志,表示发送,而ACK表示接收无误。
四次挥手:
客户端发送一个FIN,关闭到服务端的数据传输
服务器接收这个FIN,在发回一个ACK,确认序号为收到的序号加1。
服务器发送一个FIN,关闭到客户端的连接
客户端接收这个FIN,再将确认序号设置为收到的序号加1
为什么要四次挥手
因为TCP是全双工通信,两边都可以发送数据,接收数据。
因为要等两边都确认关闭了,才能释放连接,不能单独一方想要关闭就关闭,自己关闭后,处于半关闭状态,要等双方都确认关闭后再关闭。
第一次挥手,仅仅代表客户端不会再发送数据了,但是仍然可以接收数据,并不能代表服务端也不会再发送数据了。
第二次挥手:服务端现在很可能还有响应的报文要发送,这次挥手主要是回应客户端,让客户端别再发送想断开的请求了,我已经收到了。
第三次挥手,服务端的数据处理完了,也要断开了,发送FIN报文,保证服务端这边的数据处理完,现在服务端进入LAST_ACK(超时等待)
第四次挥手:客户端知道服务端的数据也处理完了,我要回应我知道了,也准备好了。双方直接释放连接。
说白了,就是一方处理完数据后,不能立马断开,要等到对方数据处理完告诉我,才行。
IP协议
IP表示网络给每个接入网络的接口一个唯一的标识符。由32组成,前面表示网络范围,后面表示主机号。
socket
socket是TCP连接的两端,用于两端口的通信。
https://www.zhihu.com/search?type=content&q=TCP%E6%BB%91%E5%8A%A8%E7%AA%97%E5%AE%9E%E7%8E%B0%E5%8F%AF%E9%9D%A0%E6%80%A7 TCP滑动窗实现可靠性
https://mp.weixin.qq.com/s/iSZp41SRmh5b2bXIvzemIw 探究!一个数据包在网络中的心路历程
https://mp.weixin.qq.com/s/bUy220-ect00N4gnO0697A 硬核!30 张图解 HTTP 常见的面试题
tcp和udp的区别,以及tcp滑动窗口
窗口:一次批量的发送多少数据
固定窗口:发送文件,对方确认,发送第二个文件,对方确认,再发
为了解决固定窗口太小,发送大文件时,需要很多次发送确认,效率低。如果窗口太大,一次发送100个,对方一次只能处理50个,不必要的数据会拥堵链路。
滑动窗口:告诉发送方可以发送数据的大小或者说窗口标记了接收端缓冲区的大小。
接收方告诉发送方自己的窗口大小,防止发送方发送数据过快而导致淹没。
TCP双工协议,两端都各有一个接收窗口和发送窗口,接收窗口取决于自己的应用系统硬件控制。发送窗口取决于对方通告的接收窗口。
发送缓存内的数据类型:
已发送并确认
已发送未确认
未发送,对方允许发送
未发送,对方还不允许发送
接收端:
已接收
未接收准备接收
未接收并未准备接收
由于ACK直接用TCP协议栈回复,默认应用无延迟,不存在已接收未回复ACk
滑动窗口实现面向流的可靠性:
最基本的传输可靠性来源于“确认重传”机制。
TCP的滑动窗口的可靠性也是建立在“确认重传”基础上的。
发送窗口只有收到对端对于本段发送窗口内字节的ACK确认,才会移动发送窗口的左边界。
接收窗口只有在前面所有的段都确认的情况下才会移动左边界。当在前面还有字节未接收但收到后面字节的情况下,窗口不会移动,并不对后续字节确认。以此确保对端会对这些数据重传。
滑动窗口的流控特性:
TCP滑动窗口是动态的,通过本端TCP实际接收能力影响了自身的接收窗口,自身的接收窗口又影响对方的发送窗口,实现根据实际情况动态调整窗口大小达到限流。
应用程序内存不足,通过API通知TCp协议栈缩小接收窗口,TCP协议栈在下一段发送时包含新的窗口大小通知给对方,对端按通知的窗口来改变发送串口来减缓发送速率的目的。
TCP两端根据报文段序列号,ACK号和接收端可用空间(窗口号)来控制流量,
http1.0 1.1 2.0的一些区别,考虑这些之后与webscoket有什么其他不同吗?
HTTP1.0 HTTP 1.1主要区别
1.长链接,HTTP 1.0长链接
2.节约带宽 HTTP 1.1支持只发送header信息,服务器认为客户端有权限请求服务器,则返回100,否则返回401。客户端如果接受到100,才开始把请求body发送到服务器。
2.HOST域:HTTP1.1HOST域,web server上的多个虚拟站点可以共享同一个ip和端口。
HTTP 1.1、HTTP2.0主要区别
1.多路复用:同一个连接并发处理多个请求
2.数据压缩:HTTP2.0使用HPACK算法对header的数据进行压缩, HTTP1.1不支持header数据的压缩
3.服务器推送:服务器会顺便把一些客户端需要的资源一起推送到客户端,客户端直接从本地加载这些资源就可以了,不用走网络。适合静态资源。
http和websocket性能区别?
长连接和短连接
长连接:
连接–传输数据—保持连接—传输数据—…直到一方关闭连接(不会四次握手),多是客户端关闭连接。长连接建立sokect连接后,传不传输数据都会保持连接,直到一方关闭,也可以设置时效。
短连接:
短连接
连接->传输数据->关闭连接
是指建立socket连接后,传输接收完数据立马断开。所以每次接收数据不会有联系(这也是HTTP协议无状态的原因之一。)
什么时候用用长连接,短连接?
长连接用于操作频繁,点对点通讯,而且连接数不能太多。因为连接需要三次握手,费时,如果操作频繁,频繁的建立socket,不仅费时,还容易造成socket错误。数据库
短连接用于WEB网站的http服务,因为长连接会占用资源,网站同时又成千上万的用户,如果每个用户对都占用一个连接的话,资源消耗给常大。
7层模型
HTTP和HTTPS的区别
HTTPS请求的过程
GET和POST的区别
如何用POST上传文件
TCP连接里的流量控制和拥塞控制
TCP的三次握手、四次挥手的状态,以及为什么分别需要3次、4次
简单介绍CDN
键入url之后到渲染网页的过程
tcp连接里的流量控制的具体过程
然后就问了中间两个项目,项目中问到了socket编程的相关内容,比较深入。
osi五层协议,分别描述一下,每层协议
tcp和udp的区别,以及tcp滑动窗口
有哪些状态码,都介绍一下,漏了500,面试官还提醒了一下
字节序和大端小端(没听过,只能放弃。。。QAQ)
3 TCP和UDP的区别,具体使用场景呢。
4 TCP四次挥手讲一下过程,最后一次ack如果客户端没收到怎么办。
5 对于socket编程,accept方法是干什么的,在三次握手中属于第几次,可以猜一下,为什么这么觉得
1 十亿个数的集合和10w个数的集合,如何求它们的交集。
集合的数字不重复。
我讲了两次循环,两次hash,以及排序或者合并等方式。。都不对。后来面试官说是对小数组做hash,然后遍历大数组即可。我完全想错方向了。
2 十亿和数找到前100个最大的,堆排序,怎么实现,怎么调整。
把你知道的TCP都说下?说一些TCP的三次握手、四次挥手?
以及各自的状态在四次挥手的情况下,如果服务器端出现了大量处于close-wait的连接状态,分析一下原因,如何设置参数解决这样的问题?在客户端time-wait的状态-般会持续多长时间?
为什么要持续这么长时间?如何有大量的time-wait状态,出现这种情况的原因是什么?
TCP的滑动窗口机制?
浏览器输入 www.xxx.com 最终展现网页,整个过程
观察者模式
http和websocket性能区别?
http1.0 1.1 2.0的一些区别,考虑这些之后与webscoket有什么其他不同吗?
对后台开发的理解,做server还是数据处理?(没懂这个问题啥意思)
介绍Http协议,如何做权限校验?有状态还是无状态?
设计token时的注意要点?
单点登录了解过吗?
Http协议cookie session介绍一下session表结构怎么设计,储存在哪里?
你们的session cookie在项目里运用到哪里?
TCP/UDP的区别介绍一下TCP如何保证传输的有效性。
TCP的拥塞控制
TCP建立连接的三次握手TCP四次挥手断开连接
三次握手和四次挥手,time_wait是什么状态
tcp为什么是可靠的
哪些情况可以用udp
8、TCP四次挥手的时候close-wait过多怎么办
9、四次挥手的内容