TCP/IP(Transmission Control Protocol / Internet Protocol)中文译为传输控制协议/因特网互联协议,这个大家族里的其它知名协议还有HTTP、HTTPS、FTP、SMTP、UDP、ARP、PPP、IEEE 802.x等。TCP/IP是当前流行的网络传输协议框架,从严格意义上讲它是一个协议族,因为TCP、IP是其中最为核心的协议,所以就把该协议族称为TCP/IP。
TCP/IP是一组网络协议,它定义了在网络中进行数据传输和通信的规则和标准。TCP/IP协议族由两个主要的协议组成:传输控制协议(TCP)和Internet协议(IP)。
TCP(Transmission Control Protocol)是一种可靠的、面向连接的协议。它负责将数据拆分成小的数据包,并通过网络传输到目标主机。TCP确保数据的可靠性,通过确认、重传和流量控制等机制来保证数据的完整性和顺序性。
IP(Internet Protocol)是一种网络层协议,用于定义数据在网络中的传输方式。它负责将数据包从源主机发送到目标主机,通过IP地址标识主机和网络,并进行路由选择。IP协议是无连接的,不对数据进行可靠性保证,只负责将数据包传输到目标地址。
TCP/IP协议族还包括其他一些重要的协议,如网际控制报文协议(ICMP)、用户数据报协议(UDP)、互联网组管理协议(IGMP)等,它们共同构成了现代互联网的基础。
通过TCP/IP协议族,计算机可以在全球范围内进行通信和数据交换。它提供了一种通用的网络通信框架,使得不同的计算机和设备能够互相通信和交换数据。TCP/IP协议在互联网上得到广泛应用,支持各种应用程序和服务,如Web浏览器、电子邮件、文件传输等。
总结起来,TCP/IP是一种网络协议族,通过TCP和IP协议提供了可靠的、面向连接的数据传输和网络通信的功能。它是构建互联网的基础,支持各种应用程序和服务的通信。
可靠性体现在TCP协议通信双方的数据传输是稳定的,即便是在网络不好的情况下,TCP都能够保证数据传输到目标端。其可靠性主要体现在以下几个方面。
1.序列号和确认号机制
TCP发送端发送数据包的时候会选择一个seq序列号,接收端收到数据包后会检测数据包的完整性,如果检测通过会响应一个ack确认号表示收到了数据包。
2.超时重发机制
TCP发送端发送了数据包后会启动一个定时器,如果一定时间没有收到接受端的确认后,将会重新发送该数据包。
3.对乱序数据包重新排序
从IP网络层传输到TCP层的数据包可能会乱序,TCP层会对数据包重新排序再发给应用层。
4.丢弃重复数据
从IP网络层传输到TCP层的数据包可能会重复,TCP层会丢弃重复的数据包。
5.流量控制
TCP发送端和接收端都有一个固定大小的缓冲空间,为了防止发送端发送数据的速度太快导致接收端缓冲区溢出。发送端只能发送接收端可以接纳的数据。
TCP流量控制的实现基于滑动窗口协议。每个TCP连接都维护着一个滑动窗口,用于控制发送方发送数据的速率。
滑动窗口是一个可变大小的缓冲区,用于存储接收方可以接收的数据。
发送方可以根据接收方的通知,将滑动窗口大小调整为合适的大小,以控制发送数据的速率。
如果接收方无法接收更多的数据,它将发送一个通知给发送方,告诉发送方它当前的缓冲区已经满了。
发送方将停止发送数据,直到接收方再次发送通知,告诉发送方它已经处理了部分数据,可以接收更多数据为止。
6.拥塞控制
TCP可以通过拥塞控制机制来避免网络拥塞的发生,通过调整发送方的发送速率,以保证网络的稳定性和可靠性。
TCP拥塞控制主要涉及三个算法:慢启动、拥塞避免和快重传/快恢复。
慢启动算法是TCP在连接建立时使用的一种算法,它通过将拥塞窗口大小从1开始逐渐增加,
直到网络达到稳定状态,以此探测网络的拥塞情况,并尽可能快地将数据发送到接收端。
拥塞避免算法是TCP在慢启动算法之后使用的一种算法,它在拥塞窗口大小到达一定程度后,
将每个往返时间内增加的拥塞窗口大小降低到1,以避免出现网络拥塞。
快重传/快恢复算法是指当TCP接收方发现丢失了数据包时,不会立即请求发送方重新发送数据包,
而是立即向发送方发送一个重复确认报文,通知发送方重发丢失的数据包,并通过减小发送方拥塞窗口的大小来避免网络拥塞。
TCP的拥塞控制算法的具体应用场景包括网络负载较高的情况下,为避免网络拥塞,
通过限制发送方的发送速率来保证网络的稳定性和可靠性。
同时,TCP拥塞控制算法也可以用于限制用户对网络资源的占用,保证公平性和公正性。
面向连接是说数据传输之前,必须要建立一个连接,然后基于这个连接进行数据传输。
TCP采用了三次握手的方式来实现可靠的连接建立。
开始时客户端和服务端都处于CLOSED状态,然后服务端开始监听某个端口,进入LISTENING状态。
第一次握手,客户端向服务端发送连接请求并携带同步序列号SYN。发送完毕后,客户端进入SYN_SENT状态。
第二次握手,服务端收到请求后,发送SYN和ACK,这里的SYN表示服务端的同步序列号,
ACK表示对前面收到请求的一个确认,表示告诉客户端,我收到了你的请求。发送完毕后,服务端进入SYN_RCVD状态。
第三次握手,客户端收到服务端的请求后,再次发送ACK,这个ACK是针对服务端连接的一个确认,
表示告诉服务端,我收到了你的请求。发送完毕后,客户端进入ESTABLISHED状态,
当服务端收到这个包后,页进入ESTABLISHED状态,至此,TCP三次握手完成可以开始数据传输。
为什么要三次握手:建立可靠的通信信道进行信息对等和防止超时。
1.通信双方都必须要维护一个序列号,去标记已经发送出去的数据包,哪些是已经被对方签收的。
2.通信双方必须要通过某种手段来实现一个可靠的数据传输通道,而三次通信是建立这样一个通道的最小值。
3.防止历史的重复连接初始化造成的混乱问题,两次握手端只能选择接受或者拒绝这个连接请求。
TCP是全双工通信,双方都能作为数据的发送发和接收方,但TCP连接会有断开的时候,TCP四次挥手(关闭一个连接)
开始时,由于客户端和服务端都处于连接状态,所以此时客户端和服务端都处于ESTABLISHED状态。
第一次挥手,客户端想要关闭连接,发送(FIN=1,seq=u)给服务端。发送完毕后,客户端进入FIN_WAIT_1状态。
第二次挥手,服务端收到客户端的FIN,发送(ACK=1,seq=v,ack=u+1)给客户端,
发送完毕后,服务端进入CLOSE_WAIT状态。客户端收到这个确认包之后,进入FIN_WAIT_2状态。
第三次挥手,服务端关闭与客户端的连接,主动发送(FIN=1,ACK=1,seq=w,ack=u+1)给客户端,
发送完毕后,服务端进入LAST_ACK状态,等待来自客户端的最后一个ACK。
第四次挥手,客户端收到服务端的关闭请求,再次发送(ACK=1,seq=u+1,ack=w+1)给服务端,
发送完毕后,进入TIME_WAIT状态,等待了某个固定时间(2MSL)之后,没有收到服务端的ACK,
认为服务端已经正常关闭连接,于是客户端自己也关闭连接,进入CLOSED状态。服务端收到这个确认包之后,关闭连接进入CLOSED状态。
为什么要四次挥手
TCP是全双工模式。双方的数据交换告诉双方都没有数据需要发送了。愉快的中断这次TCP连接。
为什么要等待2MSL(报文段最大生存时间)
1.保证TCP协议的全双工连接能够可靠关闭。
2.保证这次连接的重复数据段从网络中消失。
FIN_WAIT状态
TIME_WAIT:主动要求关闭的机器表示收到了对方的FIN报文,并发送了ACK报文,进入TIME_WAIT状态,等2MSL后即可进入到CLOSED状态。