TCP/IP协议
TCP/IP协议
TCP/IP(Transmission Control Protocol/Internet Protocol)是传输控制协议和网络协议的简称,它定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。
TCP/IP 不是一个协议,而是一个协议族的统称,里面包括了 IP 协议、ICMP 协议、TCP 协议、以及 http、ftp、pop3、https 协议等。网络中的计算机都采用这套协议族进行互联。
TCP/IP模型框架
- 链路层:处理与电缆(或者其他任何传输媒介)的物理接口细节
- 网络层:处理分组在网络中的活动,例如分组选路
- 传输层:为两台主机上的应用程序提供端到端的通讯
- 应用层:处理特定应用程序的细节
层级 | 协议 | 实现平台 |
---|---|---|
应用层 | HTTP、FTP | 基于浏览器、其他应用等 |
传输层 | TCP、UDP | 基于windows、Mac、linux |
网络层 | IP、ICMP、IGMP | 基于windows、Mac、linux |
链路层 | 设备驱动程序及接口卡、以太网协议 | 基于windows、Mac、linux |
注释:分层的目的是为了简化实际使用过程中的工作细节(物理层细节) ,减少工作量。
- 端系统(end system)
- 中间系统(intermediate system)
- 应用层和运输层使用端到端(end-to-end)协议
- 网络层提供的是逐跳(hop-to-hop)协议
- 网络IP提供的是一种不可靠的服务,它只是负责尽可能快的把分组从源结点送到目的结点,但是不提供可靠性保障。
- TCP则是在不可靠的IP层上提供一个可靠的运输层
TCP与UDP的区别
- TCP使用不可靠的IP服务,并提供一种可靠的传输层服务,即TCP的传输需要传输的双方进行确认,如果数据丢失,则需要重新传输以保证数据的完整性。
- UDP为应用程序发送和接受的数据报,和TCP不同的是其本身不可靠,即数据的发送会发生丢失,从而导致数据的不完整,但是其发送的时间短。
- IP是网络层上的主要协议,同时被TCP和UDP使用。
- ICMP是IP协议的附属协议。
TCP三次握手和四次挥手
- 三次握手
-
第一次握手
客户端向服务器发出连接请求报文,这时报文首部中的同部位SYN=1,同时随机生成初始序列号 seq=x,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。这个三次握手中的开始。表示客户端想要和服务端建立连接。
-
第二次握手
TCP服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己随机初始化一个序列号 seq=y,此时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号。这个报文带有SYN(建立连接)和ACK(确认)标志,询问客户端是否准备好。
-
第三次握手
TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。这里客户端表示我已经准备好。
-
注释:为什么要三次握手呢,而不是两次握手就好了。
举例:已失效的连接请求报文段。
client发送了第一个连接的请求报文,但是由于网络不好,这个请求没有立即到达服务端,而是在某个网络节点中滞留了,直到某个时间才到达server,本来这已经是一个失效的报文,但是server端接收到这个请求报文后,还是会想client发出确认的报文,表示同意连接。假如不采用三次握手,那么只要server发出确认,新的建立就连接了,但其实这个请求是失效的请求,client是不会理睬server的确认信息,也不会向服务端发送确认的请求,但是server认为新的连接已经建立起来了,并一直等待client发来数据,这样,server的很多资源就没白白浪费掉了,采用三次握手就是为了防止这种情况的发生,server会因为收不到确认的报文,就知道client并没有建立连接。这就是三次握手的作用。
- 四次挥手
-
第一次挥手
TCP发送一个FIN(结束),用来关闭客户到服务端的连接。客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
-
第二次挥手
服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
-
第三次挥手
服务端发送一个FIN(结束)到客户端,服务端关闭客户端的连接。服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
-
第四次挥手
客户端发送ACK(确认)报文确认,并将确认的序号+1,这样关闭完成。客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
-
注释:那么为什么是4次挥手。
为了确保数据能够完成传输。