1。TCP/IP协议族TCP/IP是一个通常分层次发展的协议族,每一层负责不同的通信功能。包含以下四个层次:链路层:又称数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中相应的网络接口卡。它们一起处理与电缆(或任何其他传输介质)的物理接口的细节。网络层:也称为网际层,处理数据包在网络中的活动,如数据包的路由。网络层协议包括IP协议(InternetProtocol)、ICMP协议(InternetControlMessageProtocol)和IGMP协议(InternetGroupManagementProtocol)。传输层主要为两台主机上的应用程序提供端到端的通信:有两种不同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。TCP在两台主机之间提供高度可靠的数据通信。他的工作包括将应用程序递交的数据分成合适的小块交给下面的网络层,确认收到的数据包,设置发送最终确认数据包的超时时钟等。由于传输层提供了高可靠性端到端通信,应用层可以忽略所有这些细节。另一方面,UDP向应用层提供非常简单的服务。它只是将称为数据报的数据包从一台主机发送到另一台主机,而不保证数据报一定会到达另一端。应用层必须提供任何必要的可靠性。应用层负责处理具体的应用细节:包括Telnet(远程登录)、FTP(文件传输协议)、SMTP(简单邮件传输协议)和SNMP(简单网络管理协议)。2、TCP协议简介TCP是一种基于字节流的面向连接(connection-oriented)、可靠的传输层通信协议。TCP将用户数据打包成报文段,发送后启动定时器,确认对方收到的数据,对乱序数据进行重新排序,丢弃重复数据。TCP的特点是:TCP是一种面向连接的传输层协议。每个TCP连接只能有两个端点。每个TCP连接只能是点对点的。TCP提供可靠的传送服务。TCP提供全双工通信。数据在两个方向上独立传输。因此,连接的每一端都必须维护每个方向上传输数据的序号。面向字节流。面向字节流的含义:虽然应用程序一次一个数据块地与TCP交互,但TCP应用程序交接的数据只是一系列非结构化的字节流。TCP报文头,如下图所示:Sourceportnumber:数据发起方的端口号,16bitDestinationportnumber:数据接收方的端口号,16bitSerialnumber:32bit的序列号,由发送方使用senderConfirmserialnumber:32bitacknowledgmentnumber是接收方期望从sender收到的下一个报文段的序号,所以确认号应该是最后一次成功接收数据的字节序号加1。Headerlength:header中32bit字的个数,可以表示一个15*32bit=60字节的header。一般标头长度为20个字节。Reserved:6bit,全0UrgentURG:当URG=1时,表示报文段中有紧急数据,应尽快发送。确认位ACK:当ACK=1时,表示这是一个确认的TCP包,如果值为0,则不是确认包。推送位PSH:当发送端PSH=1时,接收端尽快投递给应用进程。复位位(RST):当RST=1时,表示TCP连接发生严重错误,必须释放连接并重新建立。同步位SYN:用于建立连接时同步序号。SYN=1,ACK=0表示一个连接请求段。SYN=1,ACK=1表示同意建立连接。终止位FIN:当FIN=1时,表示该报文段发送方的数据已经发送完毕,需要释放传输连接。窗口:用于控制对方发送的数据量,通知释放确定的发送窗口上限。Checksum:该字段校验的范围包括头部和数据。由发送方计算和存储,并由接收方验证。紧急指针:紧急指针只在URG=1时有效,表示本段紧急数据的字节数。选项:可变长度,最多40个字节。3.三次握手过程详解所谓三次握手(Three-WayHandshake)就是建立一个TCP连接,也就是说当一个TCP连接建立后,客户端和服务端需要发送一共3个数据包来确认连接的建立。在socket编程中,这个过程是由客户端执行connect触发的,整个过程如下图所示:(1)第一次握手:客户端将标志位SYN置1,随机产生一个值seq=J,并将数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。(2)第二次握手:服务器收到数据包后,标志位SYN=1知道客户端请求建立连接,服务器将标志位SYN和ACK都设置为1,ack=J+1,并随机生成一个值seq=K,发送数据包给Client确认连接请求,Server进入SYN_RCVD状态。(3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确,标志位ACK置1,ack=K+1,并且数据包发送给服务端,服务端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务端进入ESTABLISHED状态,完成三-方式握手,然后客户端和服务器就可以开始传输数据了。4.四向挥手流程详解所谓四向挥手(Four-WayWavehand)终止TCP连接,意思是当一个TCP连接断开时,客户端和服务端需要发送一个总4个数据包以确认连接断开。在套接字编程中,这个过程是由客户端或服务器执行关闭触发的。整个过程如下图所示:由于TCP连接是全双工的,所以每个方向都要单独关闭。一个原则是,当一方完成发送数据的任务后,发送一个FIN终止这个方向的连接。收到一个FIN只是意味着这个方向没有数据流,即不会再收到数据,但是在这个TCP连接上仍然可以发送数据,直到那个方向也发送了一个FIN。先关闭的一侧将执行主动关闭,而另一侧将执行被动关闭,如上图所示。第一波:Client发送FIN关闭Client到Server的数据传输,Client进入FIN_WAIT_1状态。第二次挥手:Server收到FIN后,向Client发送ACK,确认序号为收到的序号+1(同SYN,1个FIN占1个序号),Server进入CLOSE_WAIT状态.第三次挥手:服务端发送一个FIN,关闭服务端到客户端的数据传输,服务端进入LAST_ACK状态。第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,然后向Server发送ACK,确认序号为收到的序号+1,Server进入CLOSED状态,完成四人挥手。结语为什么建立连接是三次握手,而关闭连接是四次握手?这是因为服务器处于LISTEN状态,收到连接建立请求的SYN报文后,将ACK和SYN一并发送。给客户。关闭连接时,当收到对方的FIN报文时,只代表对方不再发送数据但还能接收数据,而己方可能还没有将所有数据发送给对方,所以己方可以立即关闭,或者发送一些数据给对方后,发送FIN报文给对方表示同意现在关闭连接。所以自己的ACK和FIN一般是分开发送的。
