1、TCP 和 UDP 区别
TCP 基于连接,UDP 基于无连接。TCP 要求系统资源较多,UDP 较少。UDP 程序结构较简单。TCP 保证数据正确性,UDP 可能丢包。TCP 保证数据顺序,UDP 不保证。
TCP 长连接和短连接了
我们知道 TCP 在进行读写之前,server 与 client 之间必须提前建立一个连接。建立连接的过程,需要我们常说的三次握手,释放/关闭连接的话需要四次挥手。这个过程是比较消耗网络资源并且有时间延迟的。所谓,短连接说的就是 server 端 与 client 端建立连接之后,读写完成之后就关闭掉连接, 如果下一次再要互相发送消息,就要重新连接。短连接的优点很明显,就是管理和实现都比较简单,缺点也很明显,每一次的读写都要建立连接必然会带来大量网络资源的消耗,并且连接的建立也需要耗费时间。长连接说的就是 client server 双方建立连接之后,即使 client 与 server 完成一次读写,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接。长连接的可以省 去较多的 TCP 建立和关闭的操作,降低对网络资源的依赖,节约时间。对于频繁请求资源的客户来说,非常适用长连接。
2.TCP/IP协议涉及哪几层架构
应用层(HTTP),传输层(TCP),网络层(IP和端口),数据链路层(网络接口层),如果是HTTPS中间还有一个安全层(TLS).
3、TCP 连接 3步握手和4 步挥手的过程和必要性?
3步握手的过程和必要性:
TCP协议目的是为了保证数据能在两端准确连续的流动,可以想象两个建立起 TCP通道的设备就如同接起了一根水管,数据就是水管中的水由一头流向另一 头。然而TCP为了能让一个设备连接多根“水管”,让一个设备能同时与多个设备 交互信息,它必须要保证不同水管之间不会产生串联或相互影响 为了确保数据能够正确分发,TCP用一种叫做TCB,也叫传输控制块的数据结构把发给不同设备的数据封装起来,我们可以把该结构看做是信封。一个TCB数据 块包含了数据发送双方对应的socket信息以及拥有装载数据的缓冲区。在两个设备要建立连接发送数据之前,双方都必须要做一些准备工作,分配内存建立起TCB数据块就是连接建立前必须要做的准备工作。
(0)准备工作
最开始的时候客户端和服务器都是处于
CLOSED
状态。主动打开连接的为客户端,被动打开连接的是服务器。TCP服务器进程先创建传输控制块TCB,
时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN
(监听)状态
(
1
)
一次握手:
TCP
客户进程也是先创建传输控制块
TCB
,然后向服务器发出连接请求报文,这是报文首部中的同部位SYN=1,同时选择一个初始序列号 seq=x 。此时,TCP客户端进程进入了
SYN-SENT(同步已发送状态)状态。TCP
规定,SYN
报文段(
SYN=1的报文段)不能携带数据,但需要消耗掉一
个序号。
(
2
)二次握手:
TCP
服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1,
SYN=1,确认号是
ack=x+1,同时也要为自己初始化一个序列号 seq=y,此时,TCP
服务器进程进入
SYN-RCVD(同步收到)状态。这个报文 也不能携带数据,但是同样要消耗一个序号。ACK为
1
表示确认号有效,为
0
表示报文中不包含确认信息
(
3
)三次握手:
TCP
客户进程收到确认后,还要向服务器给出确认。确认报文
ACK=1,ack=y+1,自己的序列号seq=x+1,此时,
TCP
连接建立,客户端进入ESTABLISHED(已建立连接)状态。
TCP
规定,
ACK
报文段可以携带数据,但 是如果不携带数据则不消耗序号。当服务器收到客户端的确认后也进入established
状态,此后双方就可以开始 通信了。
注:
tcp
建立连接需要三次握手,
SYN
是发送标志位,
ACK
是确认标志位
.
为什么
TCP
客户端最后还要发送
一
次确认呢?
主要防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。 如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送了第一 个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了,由于TCP 的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发 送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关 闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报 文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连 接,这将导致不必要的错误和资源的浪费。如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受 到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于 服务器收不到确认,就知道客户端并没有请求连接。
从另一个角度理解三次握手必要性
换个易于理解的视角来看为什么要3
次握手。客户端和服务端通信前要进行连接,3
次握手
的作用就是双方都能明确自己和对方的收、发能力是正常的。 第一次握手:客户端发送网络包,服务端收到了。这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。第二次握手:服务端发包,客户端收到了。这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。从客户端的视角来看,我接到了服务端发送过来的响应数据包,说明服务
端接收到了我在第一次握手时发送的网络包,并且成功发送了响应数据包,这就说明,服务端的接收、发送能力正常。而另一方面,我收到了服务端的响应数据包,说明我第一次发送的网络包 成功到达服务端,这样,我自己的发送和接收能力也是正常的。第三次握手:客户端发包,服务端收到了。这样服务端就能得出结论:客户端的接收、发送能力,服务端的发送、接收能力是正常的。 第一、二次握手 后,服务端并不知道客户端的接收能力以及自己的发送能力是否正常。而在第三次握手时,服务端收到了客户端对第二次握手作的回应。从服务端的角度,我在第二次握手时的响应数据发送出去了,客户端接收到了。所以,我的发送能力是正常的。而客户端的接收能力也是正常的。经历了上面的三次握手过程,客户端和服务端都确认了自己的接收、发送能力是正常的。之后就可以正常通信了。