一、必须了解的UDP和TCP
Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。
Internet 的传输层有两个主要协议,互为补充。无连接的是 UDP,它除了给应用程序发送数据包功能并允许它们在所需的层次上架构自己的协议之外,几乎没有做什么特别的事情。面向连接的是 TCP,该协议几乎做了所有的事情。
UDP和TCP协议的主要区别是两者在如何实现信息的可靠传递方面不同。TCP协议中包含了专门的传递保证机制,当数据接收方收到发送方传来的信息时,会自动向发送方发出确认消息;发送方只有在接收到该确认消息之后才继续传送其它信息,否则将一直等待直到收到确认信息为止。与TCP不同,UDP协议并不提供数据传送的保证机制。如果在从发送方到接收方的传递过程中出现数据包的丢失,协议本身并不能做出任何检测或提示。因此,通常人们把UDP协议称为不可靠的传输协议。
TCP 是面向连接的传输控制协议,而UDP 提供了无连接的数据报服务;TCP 具有高可靠性,确保传输数据的正确性,不出现丢失或乱序;UDP 在传输数据前不建立连接,不对数据报进行检查与修改,无须等待对方的应答,所以会出现分组丢失、重复、乱序,应用程序需要负责传输可靠性方面的所有工作;UDP 具有较好的实时性,工作效率较 TCP 协议高;UDP 段结构比 TCP 的段结构简单,因此网络开销也小。TCP 协议可以保证接收端毫无差错地接收到发送端发出的字节流,为应用程序提供可靠的通信服务。对可靠性要求高的通信系统往往使用 TCP 传输数据。
UDP(用户数据协议),在传送数据前不需要先建立连接,远地的主机在收到UDP报文后也不需要给出任何确认。虽然UDP不提供可靠交付,但是正是因为这样,省去和很多的开销,使得它的速度比较快,比如一些对实时性要求较高的服务,就常常使用的是UDP。对应的应用层的协议主要有 DNS,TFTP,DHCP,SNMP,NFS 等。
TCP(传输控制协议),提供面向连接的服务,在传送数据之前必须先建立连接,数据传送完成后要释放连接。因此TCP是一种可靠的的运输服务,但是正因为这样,不可避免的增加了许多的开销,比如确认,流量控制等。对应的应用层的协议主要有 SMTP,TELNET,HTTP,FTP 等。
二、TCP连接简介
TCP把连接作为最基本的对象,每一条TCP连接都有两个端点,这种端点我们叫作套接字(socket),它的定义为端口号拼接到IP地址即构成了套接字,例如,若IP地址为192.3.4.16 而端口号为80,那么得到的套接字为192.3.4.16:80。
TCP报文首部
URG:(URGent)紧急,当URG=1,表明紧急指针字段有效。告诉系统此报文段中有紧急数据;
ACK:(ACKnowlegment)确认号,仅当ACK=1时,确认号字段才有效。TCP规定,在连接建立后所有报文的传输都必须把ACK置1;
PSH:(PuSH)推送,当两个应用进程进行交互式通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应,这时候就将PSH=1;
RST:(ReSeT)复位,当RST=1,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立连接;
SYN:(SYNchronization) 同步,在连接建立时用来同步序号。当SYN=1,ACK=0,表明是连接请求报文,若同意连接,则响应报文中应该使SYN=1,ACK=1;
FIN:(FINish)终止,用来释放连接。当FIN=1,表明此报文的发送方的数据已经发送完毕,并且要求释放。
三、TCP连接建立的三次握手
最开始的时候客户端和服务器都是处于CLOSED状态。主动打开连接的为客户端,被动打开连接的是服务器。
三次握手(Three-way Handshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。实质上其实就是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息。
建立连接的步骤如下:
1)TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态。
2)第一次握手:客户端尝试连接服务器,向服务器发送 syn 包(同步序列编号Synchronize Sequence Numbers),syn=1,初始发送序号seq=x,客户端进入 SYN_SEND(同步已发送状态) 发送状态等待服务器确认。(TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。)
请求连接包:SYN=1,seq=x(客户端初始序号)。
3)第二次握手:服务器接收客户端syn包并确认,确认号ack=x+1,同时向客户端发送一个 SYN包,即 SYN+ACK 包,此时服务器进入 SYN_RCVD (同步已接收状态)接收状态。(这个报文也不能携带数据,但是同样要消耗一个序号。)
确认包:SYN=1,ACK=1,seq=y(服务器初始序号),ack=x+1。
4)第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED建立连接状态,完成三次握手。(TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。)
确认包:确认报文段ACK=1,确认号ack=y+1,序列号seq=x+1(客户端序号)。
四、TCP连接四次挥手
数据传输完毕后,双方都可释放连接。最开始的时候,客户端和服务器都是处于ESTABLISHED状态,然后客户端主动关闭,服务器被动关闭。
建立一个连接需要三次握手,而终止一个连接要经过四次挥手(也有将四次挥手叫做四次握手的)。这由TCP的半关闭(half-close)造成的。所谓的半关闭,其实就是TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。
TCP 连接的拆除需要发送四个包,因此称为四次挥手(Four-way handshake),客户端或服务端均可主动发起挥手动作。
四次挥手过程如下:
1)第一次挥手:客户端发出连接释放报文,并停止发送数据。客户端进入FIN-WAIT-1(终止等待1状态),等待服务器确认。(TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。)
请求释放包:FIN=1,初始序号seq=u。
2)第二次挥手:服务器收到连接释放报文,并发出确认报文,服务端进入CLOSE-WAIT(关闭等待状态)。(TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。)
服务器确认包:ACK=1,ack=u+1,seq=v。
客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2状态),等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
3)第三次挥手:服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,由于在半关闭状态,服务器很可能又发送了一些数据,序列号为seq=w,这个时候,服务器进入了LAST-ACK(最后确认)状态,等待客户端的确认。
服务器连接释放包:FIN=1,ACK=1,ack=u+1,seq=w(服务器序号)。
4)第四次挥手:客户端收到服务器的连接释放报文后,发出一个确认包来应答,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
确认包:ACK=1,seq=u+1,ack=w+1.
以上是TCP三次握手和四次挥手的整理,欢迎评论点赞加收藏。相关题目和解答会发布在下一篇文章中。