TCP/IP协议与UDP协议

本文介绍了TCP/IP协议在互联网中的重要性,以及TCP/IP参考模型与OSI模型的区别。详细阐述了TCP和UDP协议的工作原理,强调了TCP的可靠性与UDP的效率特点。此外,详细解析了TCP连接建立的三次握手过程和连接关闭的四次挥手机制,以及在TCP协议中可能出现的丢包和乱序问题及解决方案。
摘要由CSDN通过智能技术生成

1.TCP/IP协议
目前英特网上主流的网络协议是TCP/IP协议,它是一种分层的、多协议的通信体系。TCP/IP协议的作用是在网络中完成数据的传输,比如我们通过QQ交流、浏览网页、在线观看视频等等都是通过TCP/IP协议实现的。

2.TCP/IP参考模型与OSI参考模型的图示:
在这里插入图片描述
在这里插入图片描述
TCP/IP模型是真实实现的,而OSI模型是理想化、在现实中很难实现的。

3.TCP协议/UDP协议
TCP协议/UDP协议都是在传输层进行工作的,即在程序之间传输数据。它们传输的数据有文本、图片、视频等;对于TCP协议和UDP协议,文本、图片、视频等数据都是二进制数。

4.TCP协议和UDP协议的区别:
我们可以将TCP协议比喻成打电话,把UDP协议比喻成写信。打电话与写信的区别在于打电话的反馈更快一些。
UDP协议就是把简单的数据包封装一下,然后从网卡发出就行了,数据包之间并没有状态上的联系。正因为UDP这种简单的处理方式,导致它的性能损耗非常少,对于CPU,内存资源的占用也远小于TCP,但是对于网络传输过程中产生的丢包,UDP协议并不能保证不出现丢包现象。所以,UDP在传输稳定性上要弱于TCP。我们同构以下的图表能够更深刻地理解两者的区别。
在这里插入图片描述

5.TCP协议中的三个关键步骤:三次握手、传输确认、四次挥手
1)三次握手:
(1)三次握手是客户端与服务端建立连接的过程。当客户端会先把一包“连接请求数据”(被称为SYN包)发给服务端,向服务端“询问”能否连接;如果服务端同意连接,会向客户端回复“SYN+ACK”包;客户端收到以后,会立即回复服务端一个“ACK”包;连接建立,客户端与服务端都进入了数据传输状态。在整个连接建立的过程中,客户端与服务端相互发送了三包数据,因此被称为“三次握手”。
(2)TCP协议一定要三次握手的原因是为了防止已经失效的请求报文突然又传到服务器引起错误。假设采用两次握手建立连接,客户端向服务端发送了一份“SYN”包,请求建立连接;由于某些未知原因,该“SYN”包没有成功到达服务端,在中间某个网络节点产生了滞留,为了建立连接客户端会重发一份“SYN”包,这次的“SYN”包成功到达服务端,服务端向客户端回复“SYN+ACK”包后建立起了连接,但是第一次阻塞的“SYN”包有发送到了服务端,这时服务端会以为客户端又重新发起了一个新的连接;故此,服务端认为是2个连接而客户端会认为是1个连接,会造成状态不一致,如果三次握手后,服务端都没有用收到最后的ACK包,服务端就认为建立连接失败。
(3)三次握手本质上是为了解决网络信道不可靠问题,在不可靠的网络信道上建立可靠的连接。
2)四次挥手:
处于连接阶段的客户端和服务端都可以关闭连接请求,此时需要四次挥手来进行连接关闭。
(1)第一次挥手:假设客户端1主动发起连接关闭请求,它需要将服务端2发起一个FIN包,表示要关闭连接,服务端自己就会进入终止状态。这就是第一次挥手——客户端1向服务端2发送了一个FIN包,此次客户端1进入FIN_WAIT_1状态,表示客户端1没有数据发给服务端2。
(2)第二次挥手:服务端2收到了客户端1发送的FIN包,向客户端1发送一个ACK包,客户端1进入FIN_WAIT_2状态,表示服务端2没有数据发给客户端1,即关闭连接。
(3)第三次挥手:服务端2 向客户端1发送FIN包,请求关闭连接,同时服务端2进入CLOSE_WAIT状态。
(4)第四次挥手:客户端1收到了服务端2发送的FIN包,向服务端2发送ACK包,客户端1进入TIME_WAIT状态;服务端2收到客户端1的ACK包后,立即关闭连接;此时,客户端1等待一段时间后依然没有收到回复则证明服务端已经正常关闭了,那么客户端1也可以关闭连接了。
为何客户端需要等待超时时间?因为这是为了保证对方已收到了ACK包,假设客户端发送完最后一个ACK包后就释放了连接,如果客户端发送完最后一个ACK包后,等待一段时间,这时服务端因为没有收到ACK包会重发FIN包,客户端会响应这个FIN包并重发ACK包刷新超时时间。四次挥手的机制和三次握手一样,都是为了保证在不可靠的网络链路中进行可靠的连接断开、确认。

6.TCP协议建立连接时会出现的问题
1) 丢包问题。一包数据可能会被分成多包数据,这时会涉及到丢包问题。
2)乱序问题。这些数据包到达客户端/服务端的顺序不同,这时也会牵扯到乱序问题。
为了解决以上两个问题,TCP协议为每一个连接建立了一个发送缓冲区,建立连接的第一个字节序列号为0,后面每一个字节序列号就会增加1,发送数据时,从发送缓冲区取一部分数据组成发送报文,在其TCP协议头中会附带序列号和长度,接收端在收到数据后,需要回复确认报文,确认报文中的ACK等于接收序列号加长度,也就是下一包数据需要发送的起始序列号,这样一问一答的发送方式,能够使发送端确认发送的数据已经被对方收到,发送端也可以一次性发送连续的夺宝数据,接收端只需要回复一次ACK即可。这样发送端可以将待发送的数据分割成一系列碎片发送到对端,根据序列号和长度,在接收后重构出来完整的数据,假设其中丢失了数据包,在接收端可以要求发送端重传,比如丢失了100-199,丢失了100个字节,接收端向发送端发送ACK=100的报文,发送端收到后重传这一包数据,接收端进行补齐,TCP连接是全双工的,对于客户端和服务端均采用上述机制。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值