网络四元组
网络四元组
四元组,简单理解就是在TCP协议中,去确定一个客户端连接的组成要素,它包括源IP地址、目标IP地址、源端口号、目标端口号。
正常情况下,我们对于网络通信的认识可能是这样
服务端通过ServerSocket建立一个对指定端口号的监听,比如8080。 客户端通过目标ip和端口就可以和服务端建立一个连接,然后进行数据传输。
但是我们知道的是,一个Server端可以接收多个客户端的连接,比如像这种情况
那,当多个客户端连接到服务端的时候,服务端需要去识别每一个连接。
并且TCP是全双工协议,也就是说数据允许在连接的两个方向上同时传输,因此这里的客户端,如果是反向通信,它又变成了服务端。
所以基于这两个原因,就引入了四元组的设计,也就是说,当一个客户端和服务端建立一个TCP连接的时候,通过源IP地址、目标IP地址、源端口号、目标端口号来确定一个唯一的TCP连接。因为服务器的IP和端口是不变的,只要客户端的IP和端口彼此不同就OK了。
比如像这种情况
同一个客户端主机上有三个连接连到Server端,那么这个时候源IP相同,源端口号不同。此时建立的四元组就是(10.23.15.3,59461 , 192.168.8.135,8080)
其中,源端口号是每次建立连接的时候系统自动分配的。
TCP协议为什么要设计三次握手?
关于这个问题,我会从下面3个方面来回答。
1.TCP协议,是一种可靠的,基于字节流的,面向连接的传输层协议。
可靠性体现在TCP协议通信双方的数据传输是稳定的,即便是在网络不好的情况下,TCP都能够保证数据传输到目标端,而这个可靠性是基于数据包确认机制来实现的。
TCP通信双方的数据传输是通过字节流来实现传输的
面向连接,是说数据传输之前,必须要建立一个连接,然后基于这个连接进行数据传输
2.因为TCP是面向连接的协议,所以在进行数据通信之前,需要建立一个可靠的连接,TCP采用了三次握手的方式来实现连接的建立。所谓的三次握手,就是通信双方一共需要发送三次请求,才能确保这个连接的建立。
客户端向服务端发送连接请求并携带同步序列号SYN。
服务端收到请求后,发送SYN和ACK, 这里的SYN表示服务端的同步序列号,ACK表示对前面收到请求的一个确认,表示告诉客户端,我收到了你的请求。
客户端收到服务端的请求后,再次发送ACK,这个ACK是针对服务端连接的一个确认,表示告诉服务端,我收到了你的请求。
3.之所以TCP要设计三次握手,我认为有三个方面的原因:
TCP是可靠性通信协议,所以TCP协议的通信双方都必须要维护一个序列号,去标记已经发送出去的数据包,哪些是已经被对方签收的。而三次握手就是通信双方相互告知序列号的起始值,为了确保这个序列号被收到,所以双方都需要有一个确认的操作。
TCP协议需要在一个不可靠的网络环境下实现可靠的数据传输,意味着通信双方必须要通过某种手段来实现一个可靠的数据传输通道,而三次通信是建立这样一个通道的最小值。当然还可以四次、五次,只是没必要浪费这个资源。
防止历史的重复连接初始化造成的混乱问题,比如说在网络比较差的情况下,客户端连续多次发送建立连接的请求,假设只有两次握手,那么服务端只能选择接受或者拒绝这个连接请求,但是服务端不知道这次请求是不是之前因为网络堵塞而过期的请求,也就是说服务端不知道当前客户端的连接是有效还是无效。
- 点赞
- 收藏
- 关注作者
评论(0)