一、TCP协议
1.概述
- 传输控制协议,是一种面向连接、可靠的、基于IP协议的传输层协议
- TCP的传输对象是数据报,被封装在一个IP数据报中(IP首部 + TCP首部 + TCP数据)
- 协议号是6
2.TCP协议所提供的服务
- 将用户数据打包成报文段(TCP报文:TCP头 + 数据)
- 发送数据后,启动定时器
- 另一端收到数据后,进行确认
1.检查数据的正确性
2.对失序的数据重新进行排序
3.丢弃重复的数据
3.TCP协议的可靠性
- TCP提供一种面向连接、可靠的字节流服务
- 面向连接,意味着客户端和服务端进行通信的两个应用程序在彼此交换数据之前要建立一个TCP连接(三次握手)
- 在一个TCP连接中,仅有这两个应用程序可以进行通信
4.TCP协议的可靠性机制
-
把应用数据分割成TCP认为最适合发送的数据块,当TCP发出一个报文段后,会启动一个定时器,等待目的端收到这个报文段后返回的信息;如果发送端不能及时收到这个信息,将重新发送这个报文段。
-
TCP将保持它的首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化;如果所收到的报文段的检验和有差错,TCP将丢弃这个报文段,并不确认收到此报文段(发送端的定时器会超时,并重新发送该报文段)
-
TCP将TCP报文段封装到IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序,所以TCP将对收到的报文段进行重新排序,将收到的数据以正确的顺序排列后,再交给应用层
-
TCP数据报可能会重复,TCP的接收端会丢弃重复的数据
-
TCP还能提供流量控制,TCP连接的两端都有固定大小的缓存空间;TCP的接收端只允许发送端发送接收端的缓存空间所能接纳的数据。这将防止较快速度的主机发送过多的数据报,导致较慢的主机的缓存区的数据溢出
-
TCP对字节流的内容不作任何解释,对字节流的解释由TCP连接双方的应用层进行
5.TCP协议的三次握手
- TCP协议之所以可靠,就是由于它的三次握手建立连接的机制
- 三次握手就是客户端和服务端之间相互发送三个数据包,用以确认建立连接的过程
- 过程:
1.客户端发送一个“请求标志SYN=1,初始序号seq=x(随机数)”的数据包给服务端
2.服务端发送一个“请求标志SYN=1,确认标志ACK=1,服务端的序号seq=y,客户端的确认序号ack=x+1”的数据包给客户端
3.客户端发送一个“确认序号ACK=1,客户端的序号seq=x+1,服务端的确认序号ack=y+1”的数据包给服务端 - 解析
1.客户端发送请求到服务端,服务端接收成功后,得知客户端发送正常,服务端接收正常
2.服务端发送到客户端,客户端接收成功后,得知客户端发送、接收正常,服务端发送、接收正常
3.客户端发送到服务端,服务端接收成功后,得知客户端发送、接收正常,服务端发送、接收正常
可以简单理解为,三次握手就是为了让客户端服务端知道彼此之间发送、接收都正常 -
图示:
三次握手图示
6.TCP协议的四次挥手
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。本句来源所以,主动方未必是客户端
- 步骤
1.主动关闭方向被动方发送标识位FIN=X的请求关闭的信息,可以理解成:主动方向被动方说“我这边数据传递完毕了,准备断开连接”(此时主动方依旧能接收数据)
2.被动方收到主动方发送的FIN=X的标识位信息后,被动方并不会立刻关闭连接,而是先向主动方发送一个ACK=X+1的应答消息,可以理解成:“你请求关闭连接的请求已经收到,但是我这边可能还有数据没有完成传送,等我这边的数据传送完毕后再通知你”
3.被动方传输完数据后,向主动方发送标识位FIN=Y的请求关闭的信息
4.主动方收到这个请求后,就知道被动方的数据已经传输完毕,所以这时候向被动方发送ACK=Y+1的确认信息,但是主动方害怕网络不稳定之类的原因,会导致被动方无法收到确认信息,从而被动方无法知道主动方的数据已经传输完毕,所以这时候会把自己设置成TIME_WAIT状态并启动定时器(如果被动方没有收到这个确认断开的请求,当被动方的TCP的定时器到达时间后,会要求主动方重新发送这个ACK=Y+1确认断开的请求。主动方重新发送,被动方收到后则断开连接;如果主动方在刚刚启动的定时器的时间到达后,还没有受到被动方的这个重传请求,那么主动方就知道被动方已经收到了之前的ACK=Y+1断开连接的请求并断开了连接,则主动方也会断开连接)
7、常见面试题(转载处)
- 为什么需要三次握手,两次不可以吗?或者四次、五次可以吗?
我们来分析一种特殊情况,假设客户端请求建立连接,发给服务器SYN包等待服务器确认,服务器收到确认后,如果是两次握手,假设服务器给客户端在第二次握手时发送数据,数据从服务器发出,服务器认为连接已经建立,但在发送数据的过程中数据丢失,客户端认为连接没有建立,会进行重传。假设每次发送的数据一直在丢失,客户端一直SYN,服务器就会产生多个无效连接,占用资源,这个时候服务器可能会挂掉。这个现象就是我们听过的“SYN的洪水攻击”。
总结:第三次握手是为了防止:如果客户端迟迟没有收到服务器返回确认报文,这时会放弃连接,重新启动一条连接请求,但问题是:服务器不知道客户端没有收到,所以他会收到两个连接,浪费连接开销。如果每次都是这样,就会浪费多个连接开销。 - 为什么三次握手和四次挥手?
1.三次握手时,服务器同时把ACK和SYN放在一起发送到了客户端那里
2.四次挥手时,当收到对方的 FIN 报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方是否现在关闭发送数据通道,需要上层应用来决定,因此,己方 ACK 和 FIN 一般都会分开发送。
二、UDP协议
1、概述
- UDP协议是一个不可靠的、面向数据报的传输层协议
- UDP不提供可靠性。它把应用程序传给IP的数据报发出去,不保证它们能够成功到达服务端
2、特点
- 不需要建立连接,发送数据结束后,无需进行连接释放
- 每个数据报的大小限制在64k以内
- 因为不建立连接,所以是不可靠的协议(数据可能收不到)
- 因为不建立连接,所以速度快
3、使用场景
一般运用于实时聊天、视频、语音、直播、实时性较强的游戏等这些丢失一些数据报也无关紧要的,可靠性要求较低的应用
Ps.一些应用程序是TCP和UDP结合使用,比如qq
三、TCP协议和UDP协议的区别
TCP协议 | UDP协议 |
---|---|
面向连接 | 无需连接 |
可靠的协议 | 不可靠的协议 |
保证数据的正确性 | 可能丢包 |
有丢包重传机制 | 无丢包重传机制 |
面向字节流(有先后顺序) | 面向数据包(顺序发,乱序收) |
四、如何查看应用程序使用的是TCP还是UDP
windows在小黑板输入命令:netstat -ano | findstr 端口号,可以查看指定端口程序的所有网络层信息。(也可以查看端口是否被占用)![](https://img.haomeiwen.com/i13826085/cb5d26b8d84a053c.png)
网友评论