1、TCP与UDP的区别?
TCP:Transimission Control Protocol,传输控制协议。
UDP:User Datagram Protocol,用户数据报协议。
(1)TCP是面向连接的,UDP是面向无连接的。- TCP在传输数据之前需要建立有效的连接,数据传输后需要释放连接。
- UDP在传输数据之前不需要建立连接,远程主机在接收到UDP数据报后也不用确认。
(2)TCP提供可靠的全双工通信,UDP尽最大努力通信,不保证可靠。
(3)TCP是基于字节流的,UDP是基于数据报的。
- 基于字节流:TCP将应用程序发送的数据看成一连串无结构的字节流。TCP不知道字节流的具体含义,也不保证接收方收到的数据块和发送方发送的数据块之间的大小关系。但是接收方收到的字节流必须和发送方发送的字节流完全一致。
- 基于数据报:发送方的UDP对应用程序传输的数据报添加首部后,直接交付给IP层。UDP对应用层交下来的报文既不合并,也不拆分,而是保留这些报文的边界。
(4)TCP占用资源多,UDP占用资源少。
(5)运输协议数据单元不同,TCP是报文段,UDP是用户数据报。
(6)TCP有拥塞控制,UDP没有拥塞控制。
(7)TCP不提供广播和多播服务;UDP支持1对1,1对多,多对1,多对多的交互通信
2、TCP如何保证可靠传输?
(1)校验和
- TCP在发送报文之前,发送方要计算校验和,接收方在收到数据后也要计算校验和,如果校验和不一致,则数据一定传输有误,将数据直接丢弃。
(2)序列号和确认应答
- 序列号:TCP传输时对每个字节都进行了编号,这就是序列号。序列号不仅仅是应答的作用,它还能够将接收到的数据按照序列号进行排序,去掉重复的数据。
- 确认应答:TCP传输过程中,每次接收方收到数据后,都会向发送方进行确认应答,也就是发送ACK确认报文,该报文携带对应的确认序列号,用来告诉发送方收到了哪些数据,下次从哪里开始传输。
(3)超时重传
在TCP传输过程中,发送方在发送数据之后,都会等待接收方发送的确认报文。如果中间出现差错,发送方一直没有收到确认报文,这时就要启动超时重传机制。它保证了在网络延迟和报文丢失下的可靠性。
超时原因:
- 接收方没有收到TCP报文段——网络延迟或丢包。
- 发送方没有收到ACK确认报文段——网络延迟或ACK报文丢失。
(4)连接管理
- 三次握手、四次挥手的过程。
(5)流量控制
- 让接收方来得及接收数据,避免网络丢包和网络拥塞等情况。
(6)拥塞控制
- 防止过多的数据注入到网络中,避免网络中的路由器和链路过载。
3、TCP三次握手、为什么三次,两次可以吗?
(1)TCP三次握手的过程
- 客户A主动打开连接,服务器B被动打开连接,B进入收听状态。A在建立连接之前,先向B发送连接请求报文段,其中同步位SYN=1,初始序号seq=X。这个报文段不能携带数据,但要消耗一个序号。A进入同步已发送状态(SYN-SENT)。
- B收到请求报文段,如果同意建立连接,则向A发送确认报文段,其中同步位SYN=1,序号seq=y,确认位ACK=1,确认号ack=x+1(序号seq是本报文段的第一个字节的数据编号,确认号ack是对发送过来的序号的的确认,同时也是期望收到的下一个字节的编号)。这个ACK报文段不能携带数据,但要消耗一个序号。B进入同步收到的状态(SYN-RCVD)。
- A收到B的确认报文后,再次向B发送确认报文。其中ACK=1,seq=x+1,ack=y+1(同理,seq是本报文段的第一个字节的序号,也是上一个报文段希望收到的序号;ack对上一个报文发送的序号进行确认),这个ACK报文段可以携带数据,如果不携带数据则不消耗序号。此时A进入已连接状态,B收到确认后也进入已连接状态。
(2)为什么最后一次要确认?
- 防止已失效的连接请求报文段突然传送到B引发错误。
- 失效的连接请求——A第一次发送连接请求,但是丢失了。于是A重新发送请求,建立连接,发送数据,释放连接。但是,有可能出现异常状况,即A发送的连接请求报文段并没有丢失,而是滞留在网络中。如果在数据传输完成后,这个滞留的请求又发送到B,B误以为A还要发送数据,因此向A发送确认报文段,同意建立连接,如果没有最后一次确认,那么B发送确认报文段之后,连接就建立了。由于A没有发送数据的需求,因此不会理睬B,但B认为连接已经建立,一直等待A发送数据,这样就白白浪费了许多资源。而如果有第三次确认,当服务器收不到客户端发送的确认报文时,连接就不会建立。
4、TCP四次挥手过程,为什么四次挥手,为什么要有timewait?
(1)TCP四次挥手过程
A和B目前都处于已连接状态,A向B发送连接释放报文,FIN=1,seq=u,这时A进入FIN-WAIT-1状态,等待B的确认。(请求释放客户端到服务器的连接)
B收到连接释放报文后立即确认,ACK=1,seq=v,ack=u+1,B进入CLOSE-WAIT状态。此时客户端到服务器的连接已释放,TCP属于半关闭状态,B能向A发送数据,而A不能向B发送数据。(同意释放客户端到服务器的连接)
A收到B的确认后,进入FIN-WAIT-2状态,等待B发送连接释放报文段。
当B将数据发送完之后,向A发送连接释放报文段,FIN=1,ACK=1,seq=w,ack=u+1,B进入LAST-ACK状态。(请求释放服务器到客户端的连接)
A收到后,向B发送确认报文,ACK=1,seq=u+1,ack=w+1,此时A进入TIME-WAIT状态,等待2MSL(最大报文段寿命)的时间后,A进入CLOSED状态。(同意释放服务器到客户端的连接)
B收到A的确认后,释放连接,进入CLOSED状态。
(2)为什么要四次挥手?
- 因为TCP是全双工通信,客户端请求关闭连接后,客户端到服务器的连接关闭(一二次挥手);而服务器要将剩余数据发送完毕之后才会请求关闭连接,服务器到客户端的连接关闭(三四次挥手)。所以,TCP释放连接时,服务器的ACK和FIN是分开的(中间隔着数据传输),而TCP建立连接时,服务器的SYN和ACK是一起发送的(第二次握手),所以握手是三次,挥手是四次。
(3)为什么要有timewait?
- 保证A最后的确认报文段能够到达B。如果B没有收到A发送的确认报文,则会再次向A发送连接释放报文,A再次发送确认报文,并且重启计时器,直到A和B都进入CLOSED状态。另外,B比A先进入CLOSED状态。
- 在等待的这段时间中,让本次连接中的所有报文都消失在网络中,防止“已失效连接报文”对下次连接造成影响。
5、TCP如何进行流量控制?
利用滑动窗口实现流量控制。
设A向B发送数据,在建立连接时,B告诉A它的窗口接收大小为rwnd=400。发送方A的发送窗口大小不能超过接收方的滑动窗口大小,设每个报文段100字节,初始序号是1。
B进行了三次流量控制。第一次将窗口大小降为300,第二次降为100,第三次降为0。窗口值降为0时,A将停止发送数据,直到B再次发送新的窗口值。B发送的ACK确认报文,只有在ACK=1时,ack序号才会有效。
当B一直没有发送新的窗口值时,A就会一直等待。为了解决这个问题,TCP为每一个连接设有一个持续计时器。只要发送方收到窗口值为0的报文段,就会开启持续计时器,当计时器的时间到了之后,发送方会发送一个窗口探测的报文段;当接收方收到窗口探测的报文段之后,就会确认并发送新的窗口值,如果窗口值仍然是0,则重置计时器,继续计时。
6、TCP如何进行拥塞控制?
TCP进行拥塞控制的方法主要有:慢开始,拥塞避免,快重传,快恢复。
判断网络拥塞的依据:是否出现超时。
慢开始:在刚开始发送数据时,设置一个较小的拥塞窗口值cwnd,每收到一个新报文段的确认,就将cwnd+1。(这样,cwnd相当于是以2^n在增长)
拥塞避免:因为慢开始算法使得cwnd增长较快,因此要设置一个慢开始门限值ssthresh。当cwnd=ssthresh时,启动拥塞避免算法,cwnd开始线性增长。
如图所示,初始ssthresh=16,cwnd=1,一开始采用慢开始算法,cwnd开始指数增长。
当cwnd=16时,启动拥塞避免算法,cwnd开始线性增长。
当cwnd=24时,网络出现超时,即拥塞出现。这时将cwnd降为初始值,并将ssthresh设为拥塞出现时的cwnd的一半,重新开始慢开始-拥塞避免。
快重传:快重传的目的是让发送方尽早知道某个报文段的丢失。当重复收到某一报文段的3次确认时,就可以判断,该报文段的下一个报文段可能出现了丢失。这时启动快重传算法,立即重传丢失的报文。
- 如拥塞窗口变化图中第④阶段时,cwnd=16,发送方连续收到三次报文段的确认,意识到出现报文丢失的情况,立即启动快重传算法。
快恢复:快重传算法的启动是由于个别报文段的丢失,这时并不将其判断为网络拥塞,而是启动快恢复算法,让cwnd=ssthresh=当前cwnd/2,并开始拥塞避免。
- 如拥塞窗口变化图中第⑤阶段时,cwnd=ssthresh=16/2=8。
7、TCP和UDP对应的协议分别有哪些?
- TCP对应的协议
- UDP对应的协议
8、端口以及对应的服务?
服务器端
熟知端口号:0~1023。IANA把一些端口号指派给了TCP/IP最重要的一些程序。当有一些新的应用程序出现时,IANA必须给它指定一个熟知端口号,否则互联网上的其他应用进程无法与它进行通信。
登记端口号:1024~49151。这类端口号是为没有熟知端口号的应用程序准备的。这类端口号必须在IANA中按照规定进行登记,防止重复。
客户端
- 49152~65535。只有在客户端进程运行时才会动态选择,因此又叫短暂端口号。这类端口号留给客户进程选择暂时使用,通信结束后就释放,不再占用。
9、DNS域名系统及其工作原理?
- DNS,Domain Name System,是互联网使用的命名系统,用来将人们的机器名字转换为IP地址。
如上图所示为查找www.google.com,主机首先向本地域名服务器发起递归查询。
- 递归查询:如果本地域名服务器没有所需域名的IP地址,即在DNS高速缓存中没有找到相应IP地址,那么本地域名服务器就以客户的方式向其他根域名服务器继续查询。(主机向本地域名服务器发起查询时一般使用递归查询)
本地服务器发现DNS高速缓存中没有该网址的IP地址记录,随即使用迭代查询向一个根域名服务器进行查询。
- 迭代查询:当某个根域名服务器收到本地域名服务器的查询请求时,要么告诉本地域名服务器所需的IP地址,要么告诉它下一步应该向哪个服务器发起询问。
根域名服务器告诉本地域名服务器下一步应该向顶级域名服务器com查询,随即本地域名服务器向com域名服务器发起询问。
顶级域名服务器com告诉本地域名服务器下一步应该向权限域名服务器google.com查询,随即本地域名服务器向google.com域名服务器发起询问。
权限域名服务器告诉本地域名服务器查询到的IP地址,随即本地域名服务器将IP地址传回主机,同时将查询到的IP地址记录在DNS高速缓存中。
10、HTTP协议及一次HTTP操作?
HTTP协议
HTTP是面向事务的应用层协议,它是万维网上能够可靠的交换文件(文本、声音、图像等)的重要基础。
HTTP是面向事务的客户服务器协议。
HTTP1.0协议是无状态的。
HTTP协议本身是无连接的。
一次HTTP操作的过程
如上图所示,浏览器向DNS发出请求,解析www.tsinghua.edu.cn的IP地址。
DNS解析出IP地址后,浏览器与服务器建立TCP连接。
浏览器发出取文件命令:GET/chn/yxsz/index.htm。
服务器给出响应,把index.htm发送给浏览器。
释放TCP连接。
浏览器拿到数据后进行渲染,显示界面。
11、HTTP报文的格式?
HTTP报文由两部分组成:
请求报文
响应报文
可以发现,请求报文和响应报文都是由开始行、首部行和实体主体组成,二者的区别就是开始行不同。
开始行
在请求报文中又叫请求行,包括方法、URL和HTTP版本三个部分。
在响应报文中又叫状态行,包括HTTP版本、状态码和短语三个部分。
首部行
- 用来说明服务器、浏览器或报文主体的一些信息。
实体主体
- 一般不用。
12、HTTP请求报文中的方法有哪些?
13、HTTP状态码及其代表的意思?
1XX——表明通知信息,如请求收到了或正在处理请求。
2XX——表明请求被正常处理了。
200 OK:请求已正常处理。
204 No Content:请求处理成功,但没有任何资源返回给客户端。一般在只需要客户端向服务器发送信息,而服务器不需要对客户端发送新信息的情况下使用。
206 Partial Content:是对资源某一部分的请求。该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求。响应报文中包含由Content-Range指定范围的实体内容。
3XX——表明浏览器需要进行某些特殊的处理以正确处理请求。
301 Moved Permanently:资源的URI已经更新,你也更新一下你的书签引用吧。永久性重定向,请求的资源已经被分配了新的URI,以后应使用资源现在所指的URI。
302 Found:资源的URI已临时定位到其他位置了,姑且算你已经知道了这个情况。临时性重定向,与301类似,但302代表的不是永久性移动,只是临时性质的。也就是说,已移动的资源对应的URI将来还有可能发生改变。
303 See Other:资源的URI已更新,你是否能按照新的URI进行访问。该状态码表示,由于请求对应的资源对应着另一个URL,应使用GET方法定向获取请求的资源。303状态码和302状态码有着相同的功能,但303状态码明确表示客户端应当采用GET方法来获取资源。当301、302、303状态码返回时,几乎所有浏览器都会把POST改成GET,并删除请求报文内的主体,之后请求会自动重新发送。
304 Not Modified:资源已找到,但不符合条件请求。该状态码表示客户端发送附带条件的请求时,服务端允许请求访问资源,但因发生请求为满足的条件后,直接返回304。
- 附带条件:采用GET方法的请求报文中包含If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since中任一首部。
307 Temporary Redirect:临时重定向,与302有相同含义。
4XX——表明客户端是发生错误的所在
400 Bad Request:服务器端无法理解客户端发送的请求,请求报文可能存在语法错误。
401 Unauthorized:该状态码表示发送的请求需要有通过HTTP认证的认证信息。
403 Forbidden:不允许访问那个资源。该状态码表明对请求资源的访问被服务器拒绝了。
404 Not Found:服务器上没有请求的资源。路径错误等。
5XX——服务器本身发生错误
- 500 Internal Server Error:貌似内部资源出故障了。该状态码表明服务器端在执行请求时发生了错误。也有可能是web应用存在bug或某些临时故障。
- 503 Service Unavailable:抱歉,我现在正忙着。该状态码表明服务器暂时处于超负载或正在停机维护,现在无法处理请求。
14、输入一个URL后的过程?
输入待访问的地址
浏览器通过DNS解析该域名的IP地址。
得到IP地址后,浏览器和web服务器通过三次握手进行TCP连接。
浏览器向web服务器发送一个HTTP请求。
某些服务器会做永久重定向响应。
浏览器跟踪重定向地址。浏览器获取重定向响应之后,在响应报文中找到重定向地址,重新开始第一步访问。
服务器处理请求,然后返回一个响应。
服务器发出一个HTML响应。
释放TCP连接。
浏览器渲染,显示页面。
15、HTTP和HTTPS的区别?
概念
HTTP:是互联网上应用最广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准,用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。
HTTPS:是以安全为目标的HTTP通道,简单讲就是HTTP的安全版,即在HTTP下加入SSL层。HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。HTTPS协议的作用可以分为两种:
- 建立一个信息安全通道,来保证数据传输的安全。
- 确认网站的真实性。
区别
HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费。
HTTP协议运行在TCP之上,所有传输的内容都是明文的;HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都是经过加密的。
HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
HTTPS可以有效的防止运营商劫持。
16、HTTP长连接和短连接?
17、如何用UDP实现TCP?
18、TCP黏包问题?
19、IP数据报的格式?
20、UDP数据报的格式?
21、TCP报文段的格式?