TCP与UDP详解
面试TCP协议的意义
- 从面试官的角度:可以快速考察候选人对基础知识的掌握程度,以及候选人对待技术的之前所有然的态度。
- 从求职者的角度:即使工作内容中没有直接使用到TCP协议,但在遇到网络故障,调试和分析问题时,熟悉TCP显得十分重要,要不然抓包都看不懂。
- 从学习的角度,我们可以学习TCP的设计理念,比如TCP重传,拥塞控制,以及如何在性能和原理之间做权衡和取舍,举一反三,将这些原理细节应用到我们平时的软件设计上,也是一种思维上的学习成长。
UDP与TCP
相同点,都是建立在OSI七层模型中的第四层-------传输层(Transport)程序之间的数据传输
不同之处:
- UDP:基于非连接
- TCP:基于连接
UDP基于非连接:
例如写信:对方是否接收、内容是否完整、顺序是否正确 -------------这些都不能得到及时的信息反馈
TCP基于连接:
例如打电话:电话接通、互相通话、结束挂断-----------------每个环节你都可以得到及时的信息反馈
三次握手过程:
为什么是三次握手,而不是两次
服务端回复了SYN+ACK包就建立连接,这是防止已失效的请求报文突然又传到服务器引起错误
当客户端向服务端发送一个连接请求SYN,由于网络某个节点异常产生滞留,第一次发送的SYN没有到达服务器,
客户端为了建立连接会重新发送一个SYN包,服务端返回SYN+ACK包建立连接,此时第一包被阻塞的数据突然恢复,服务端接收到了SYN包并返回了SYN+ACK包,此时服务端就会认为是两个连接请求,而客户端只承认是一个请求,这就造成了服务端与客户端的两个状态不一致。
三次握手的目的是:在不可靠的网络信道上建立可靠的连接。
四次挥手过程:
关闭连接请求客户端和服务端是相对的,即客服端可以向服务端发送关闭连接请求,服务端也可以向客户端发送关闭连接请求。
-
TCP 为什么要三次握手和四次挥手?
三次握手是为了确认双方的收发能力都没有问题,四次挥手是确保数据都发送完了才结束
-
TCP握手的目的有哪些?
确认双方的收发能力都没有问题,初始化序列号,确认窗口大小即 MSS 等信息
-
为什么 TCP 第二次握手的 SYN 和 ACK 要合并成一次?
分开两次发送,浪费资源
-
TCP三次握手过程,有什么状态,状态机如何变化?
客户端主动向服务端握手:
- 一开始客户端为 CLOSED 状态,服务端为 LISTEN 状态
- 首先客户端发送 SYN 报文,将 seq 置为 x,此时客户端状态转为 SYN_SENT
- 服务端收到后 SYN 抱文后返回 SYN+ACK 报文,将 seq 置为 y,ack 置为 x+1,此时服务器状态转为 SYN_RCVD
- 客户端收到 SYN+ACK报文,此时客户端已经知道双方的收发都没有问题,但为了让服务端知道故返回 ACK 报文,将 ack 置为
- y+1,此时客户端状态为 ESTABLISHED,并可以发送数据
- 服务端收到 ACK报文,此时服务端已经知道双方的收发都没有问题,此时服务端状态为 ESTABLISHED
- 至此连接建立成功
-
SYN Flood 的原理?有哪些防范的方法?
客户端发送三次握手的第一个 SYN 报文后收到服务器的报文却不回应,从而导致服务器的半开资源浪费直到超时释放
可以使用 SYN Cookie,即通过将源目地址及 IP 地址和端口号哈希为序列号,将返回的 ACK-1 得到原来的序列号判断是否正确,直到连接建立才分配资源
-
三次握手可以携带数据吗
第一次、第二次握手不可以携带数据,而第三次握手是可以携带数据的。
我们可以思考一个问题,假如第一次握手可以携带数据的话,如果有人要恶意攻击服务器,那他每次都在第一次握手中的 SYN 报文中放入大量的数据,疯狂着重复发 SYN 报文,这会让服务器花费大量的内存空间来缓存这些报文,这样服务器就更容易被攻击了。
对于第三次握手,此时客户端已经处于连接状态,他已经知道服务器的接收、发送能力是正常的了,所以可以携带数据是情理之中。
TCP UDP HTTP 三者的关系
原文连接:http://t.csdn.cn/lgj1v
TCP/IP是个协议组,可分为四个层次:网络接口层、网络层、传输层和应用层。
在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。
在传输层中有TCP协议与UDP协议。
在应用层有HTTP、FTP、TELNET、SMTP、DNS等协议。
TCP 传送控制协议(Transmission Control Protocol):
TCP是传输层的一个协议,基于IP协议,用来传输类似HTTP的信息。如果把IP协议类比为一个“公路”的话,那TCP协议可以看成是在公路上行驶的“卡车”。TCP协议是面向连接的协议,通过三次握手机制,尽量保证连接的可靠性。tcp的链接需要进行三次握手,释放连接需要四次挥手。
UDP 用户数据报协议 (User Datagram Protocol) :
UDP也是传输层的一个协议。但是与TCP不同的是,UDP不是面向连接的,并不保证传输的可靠性,没有TCP的建立连接的三次握手机制,对于传输效率上面有了提升。
个人理解:
这个就比较简单粗暴了,A要给B传数据,然后就直接传了。
HTTP 超文本传输协议(HyperText Transfer Protocal):
- HTTP是在应用层的一个协议,本身就是一个协议,是从Web服务器传输超文本到本地浏览器的传输协议。
- HTTP协议基于请求\响应模型的,并且是基于TCP协议的。
- HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。
个人理解:
- 一个协议,是从Web服务器传输超文本到本地浏览器的传输协议。
- HTTP协议基于请求\响应模型的,并且是基于TCP协议的。
- HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。
个人理解:
应用层的协议,支持服务器和web浏览器进行交互,响应结束后请求对象和响应请求对象立刻被销毁。
谈到http那就再谈谈https。。。。
HTTPS协议
1、浅谈HTTP的缺点:(当然HTTP还是具有相当优秀和方便的一面的,只是就跟ACP原则一样)
- 通信使用明文(不加密,大家都知道明文传输是不安全的吧),内容可能会被窃听
- 不验证通信方的身份,因此有可能遭遇伪装
- 无法证明报文的完整性,所以有可能已遭篡改
- 等。。。
2、HTTPS协议概述:
HTTPS协议==HTTP协议+SSL/TLS协议
HTTPS:是以安全为目标的 HTTP 通道,是 HTTP 的安全版。HTTPS 的安全基础是 SSL。SSL 协议位于 TCP/IP 协议与各种应用层协议之间,为数据通讯提供安全支持。SSL 协议可分为两层:SSL 记录协议(SSL Record Protocol),它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。SSL 握手协议(SSL Handshake Protocol),它建立在 SSL 记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
HTTPS 设计目标:
(1) 数据保密性:保证数据内容在传输的过程中不会被第三方查看。就像快递员传递包裹一样,都进行了封装,别人无法获知里面装了什么 。
(2) 数据完整性:及时发现被第三方篡改的传输内容。就像快递员虽然不知道包裹里装了什么东西,但他有可能中途掉包,数据完整性就是指如果被掉包,我们能轻松发现并拒收 。
(3) 身份校验安全性:保证数据到达用户期望的目的地。就像我们邮寄包裹时,虽然是一个封装好的未掉包的包裹,但必须确定这个包裹不会送错地方,通过身份校验来确保送对了地方 。
3、SSL协议:网络安全协议(安全套接层)
1)SSL协议是在传输通信协议上实现的一种安全协议,采用公开秘钥技术,广泛支持各种类型的网络,同时提供三种基本的安全服务:
-
认证用户和服务器,确保数据发送到正确的客户机和服务器;
-
加密数据以防止数据中途被窃取;
-
维护数据的完整性,确保数据在传输过程中不被篡改;
2)SSL协议的优势在于它与应用层协议独立无关,高层的应用层协议能透明的建立于SSL协议之上,SSL协议在应用层协议通信之前就已经完成加密算法,通信秘钥协商以及服务器的认证工作;在此之后应用层协议所传送的数据都会被加密,从而保证通信的私密性和完整性。
4、HTTP 与 HTTPS 的区别
-
HTTPS 协议需要到 CA (Certificate Authority,证书颁发机构)申请证书,一般免费证书较少,因而需要一定费用。(以前的网易官网是http,而网易邮箱是 https 。)
-
HTTP 是超文本传输协议,信息是明文传输,HTTPS 则是具有安全性的 SSL 加密传输协议。
-
HTTP 和 HTTPS 使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
-
HTTP 的连接很简单,是无状态的。HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。(无状态的意思是其数据包的发送、传输和接收都是相互独立的。无连接的意思是指通信双方都不长久的维持对方的任何信息。)