TCP/IP协议详解

TCP/IP是什么?

TCP/IP是Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台联网设备规定一个地址。 
1、TCP:面向连接的通信协议,通过三次握手建立连接(socket通过TCP/IP连接时就是经过3次握手),通信完成后要关闭连接,它只用于端对端的通讯 。TCP协议通过3次握手建立起一个可靠的连接,通过将数据包进行排序以及检验的方式,可以提供一种可靠的数据流服务 ,TCP可以限制数据的发送速度,间接地控制流量 
2、IP:IP协议包含源主机地址、目标主机地址,还有TCP数据信息。但IP协议没有做任何事情来确认数据包是否按顺序发送或者包是否被破坏,所以IP数据包是不可靠的。 
3、UDP: 
面向无连接的通讯协议,UDP数据包括原端口号信息以及目标端口号信息,它可以实现广播发送 。由于UDP通讯不需要接收方确认,所以属于不可靠的传输,可能会出现丢包现象。

数据格式

数据帧:帧头+IP数据包+帧尾 
帧头包括源和目标主机MAC地址及类型,帧尾是校验字 
IP数据包:IP头部+TCP数据信息 
IP头包括源IP地址和目标主机IP地址 
TCP数据信息:TCP头部+实际数据 
TCP头包括源端口号和目标主机端口号、顺序号、确认号、校验字

TCP/IP四层概念模型

1、链路层 

也称作数据链路层或网络接口层(在第一个图中为网络接口层和硬件层),通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。网络接入层与OSI七层模型中的物理层和数据链路层相对应。它负责监视数据在主机和网络之间的交换。事实上TCP/IP本身并未定义该层的协议,而由参与互相的各网络使用自己的物理层和数据链路层协议,然后与TCP/IP的网络接入层进行连接,地址解析协议(ARP)工作在此层,即OSI七层模型的数据链路层;  
2、网络层

也称作互联网层(在第一个图中为网际层)它对应OSI七层模型中的网络层。主要解决主机到主机的通信问题。在TCP/IP协议族中,网络层协议包括IP协议(网际协议),ICMP协议(Internet互联网控制报文协议),以及IGMP协议(Internet组管理协议)。IP是一种网络层协议,提供的是一种不可靠的服务,它只是尽可能快的把分组从源接点送到目的结点,但是并不提供任何可靠性保证,同事被TCP和UDP使用,TCP和UDP的每组数据都通过端系统和每个中间路由器的IP层在互联网中进行传输。ICMP是IP协议的附属协议。IP层用它来与其他主机或路由器交换错误报文和其他重要信息。IGMP是Internet组管理协议。它用来把一个UDP数据报多播到多个主机。

3、传输层

传输层对应的OSI七层模型中的传输层,主要为两台主机上的应用程序提供端到端的通信,保证了数据包的顺序传送及数据的完整性。在TCP/IP协议族中,有两个互不相同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。

TCP为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。为了提供可靠的服务,TCP采用了超时重传、发送和接收端到端的确认分组等机制。

UDP则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。一个数据报是指从发送方传输到接收方的一个信息单元(例如,发送方指定的一定字节数的信息)。UDP协议任何必需的可靠性必须由应用层来提供。

TCP协议提供的是一种可靠的、通过“三次握手”来连接的数据传输服务,而UDP协议提供的则是不保证可靠的(并不是不可靠)、无连接的数据传输服务。

4、应用层

应用层也称为应用实体(AE),它由若干个特定应用服务元素(SASE)和一个或多个公用应用服务元素(CASE)组成。每个SASE提供特定的应用服务,例如文件运输访问和管理(FTAM)、电子文电处理(MHS)、虚拟终端协议(VAP)等。CASE提供一组公用的应用服务,例如联系控制服务元素(ACSE)、可靠运输服务元素(RTSE)和远程操作服务元素(ROSE)等。

应用层决定了向用户提供应用服务时通信的活动。TCP/IP 协议族内预存了各类通用的应用服务。包括 HTTP,FTP(File Transfer Protocol,文件传输协议),DNS(Domain Name System,域名系统)服务。

从TCP/IP角度来理解一次http请求与响应的过程


TCP的三次握手

TCP是面向连接,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在TCP/IP协议中,TCP协议提供可靠的连接服务,连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号并交换TCP窗口大小信息。 


第一次握手

建立连接。客户端发送连接请求报文段,将SYN位置的1,Sequence Number为X,然后,客户端进入SYN_SEND状态,等待服务器的确认。

第二次握手

服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为X+1(Sequence Number+1);同时,自己还要发送SYN请求信息,将SYN设置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;

第三次握手

客户端收到服务器的SYC+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕后,客户端和服务器都进入established状态,完成TCP的三次握手。

用三次握手的原因:

为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。 
具体例子:“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。”

TCP四次挥手

当客户端和服务器通过三次握手建立了TCP连接以后,当数据传送完毕,肯定是要断开TCP连接的,对于TCP的断开连接,就用到了神秘的“四次分手”。 


第一次挥手

主机1(可以使客户端,也可以是服务器端),设置Sequence Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;

第二次挥手

主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求;

第三次挥手

主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态;

第四次挥手

主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。

用四次挥手的原因:

TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。

猜你喜欢

转载自blog.csdn.net/qq_37345604/article/details/80240668