TCP和UDP的区别
(1)TCP 是面向连接的,udp 是无连接的即发送数据前不需要先建立链接。
(2)TCP 提供可靠的服务。也就是说,通过 TCP 连接传送的数据,无差错,不丢失, 不重复,且按序到达;UDP 尽最大努力交付,即不保证可靠交付。 并且因为 tcp 可靠, 面向连接,不会丢失数据因此适合大数据量的交换。 (3)TCP 是面向字节流,UDP 面向报文,并且网络出现拥塞不会使得发送速率降低(因 此会出现丢包,对实时的应用比如 IP 电话和视频会议等)。
(4)TCP 只能是 1 对 1 的,UDP 支持 1 对 1,1 对多。
(5)TCP 的首部较大为 20 字节,而 UDP 只有 8 字节。
(6)TCP 是面向连接的可靠性传输,而 UDP 是不可靠的
TCP三次握手
什么是TCP的三次握手?
关于TCP的三次握手,很多博客回答上都已经说的比较明白了,往简单的说,就是互相建立连接,并且保证数据准确传输。
TCP三次握手的过程
情景模拟 1.0
发送方:老铁,可以听得到我说话吗,老铁。
接收方:可以听到,你听得到吗?
发送方:听到了,那我开始说正事了。
这个故事是用来模拟TCP三次握手的,也是在所有通俗解释三次握手的典型例子。
三次握手图示
三次握手过程解释
三次交换数据的过程细节先不看,从客户端、服务器状态进行解释。
状态变化:
客户端和服务器同时属于closed状态,表示没有连接关系。
客户端发送请求,客户端打开发送(SYN-sent)状态,同时服务器打开监听(Listen)状态;
服务器在接收到客户端的请求时,服务器切换为回复(SYN-recvd)状态;
客户端在接收到服务器的响应时,客户端切换为稳定连接(Estab-lished)状态的同时发送第二次数据包。
服务器在接收到客户端的第二次数据时,服务器切换为稳定连接(Estab-lished)状态。
双方建立稳定连接后,开始正常通信数据。
重要字段
过程了解之后,就应该知道其传输的字段是什么意思了。如下是其中重要的字段。
序号(sequence number):seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
确认号(acknowledgement number):ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。
标志位(Flags):共6个,即URG、ACK、PSH、RST、SYN、FIN等。具体含义如下:
URG:紧急指针(urgent pointer)有效。
ACK:确认序号有效。(为了与确认号ack区分开,我们用大写表示)
PSH:接收方应该尽快将这个报文交给应用层。
RST:重置连接。
SYN:发起一个新连接。
FIN:释放一个连接。
那么这些字段有什么作用呢?
seq序号、ack序号:用于确认数据是否准确,是否正常通信。
标志位:用于确认/更改连接状态。
三次握手图示
情景模拟 2.0
下述为各标签的作用,根据标点符号相互的对应。
第一次握手:你能和我建立连接吗,可以接受到我的数据吗。
SYN = 1 ,seq = x
第二次握手:可以建立连接,我接受到你的请求了,能接受到我的数据吗,你的数据是这个吗
SYN = 1 ,ACK = 1 ,seq = y ,ack = x + 1
第三次握手:我已经收到你的回复,这是我的数据,这是你的数据(用于再次核对)
ACK = 1 ,seq = x + 1 ,ack = y + 1
建立连接成功。
总结:各字段在TCP三次握手中的作用:
SYN:用于建立连接。
ACK:用于确定收到了请求。
seq:发送自己的数据。
ack:发送接收到的对方的数据。