首先我们需要意识到的一点:TCP/IP 协议是众多协议的集合,根据 TCP/IP 的分层不同,对应的协议族也不同。TCP/IP协议在一定程度上参考了OSI的体系结构,并将其简化为了四个层次。
1、应用层:应用层是TCP/IP协议的第一层,是直接为应用进程提供服务的。
2、运输层:作为TCP/IP协议的第二层,运输层在整个TCP/IP协议中起到了中流砥柱的作用。且在运输层中,TCP和UDP也同样起到了中流砥柱的作用。
3、网络层:网络层在TCP/IP协议中的位于第三层。在TCP/IP协议中网络层可以进行网络连接的建立和终止以及IP地址的寻找等功能。
4、网络接口层:在TCP/IP协议中,网络接口层位于第四层。由于网络接口层兼并了物理层和数据链路层,所以网络接口层既是传输数据的物理媒介,也可以为网络层提供一条准确无误的线路。
之后,我们再来看三次握手,四次挥手,首先我们需要知道TCP报文的格式,这里我放一张图片共大家理解。
在建立和关闭连接的过程中,我们一般提到的有序号(seq),确认序号(ack),
以及分别由一个二进制位构成的(ACK,SYN,FIN)。
三次握手:
刚开始客户端处于closed状态,服务端处于listen状态。
1.首先客户端先向服务器端发送一个TCP报文
将SYN位置1,表示建立连接,并发送生成的唯一的seq=x,此时客户端处于SYN_Send状态。
2.服务器端收到来自客户端的TCP报文之后,结束LISTEN阶段。并返回一段报文
服务端向客户端发送一个确认消息包,SYN置1,ACK置1表示确认建立连接,seq=y,ack=x+1(由1步骤中seq序列号+1),此时服务端处于SYN_RCVD状态。
此时,客户端知道自己的发送和接受功能正常,服务端只知道自己的接收功能正常,还需要确认自己的发送功能是否正常,于是便有了第三次握手
3.客户端接收到来自服务器确认收到数据的TCP报文后,明确了从客户端到服务器的数据传输是正常的,结束SYN-SENT阶段,并返回一段TCP报文
ACK置1,seq=x+1,ack=y+1(ack = 发起方的seq + 1),客户端处于established状态。
4.服务端收到ack报文后,处于established状态,至此连接建立。
1.确保双方的接受能力、发送能力是否正常。
2.指定自己的初始化序列号,为后面的可靠性传输做准备。
1.seq是动态生成的,为了防止能够猜出后续的确认号。
2.当服务器第一次收到客户端的SYN置1的报文后,处于SYN_RCVD状态,服务器会把此种状态下的请求连接放在一个队列里,称为半连接队列。当三次握手完成,建立起的就是全连接队列,如果队列满了,可能会出现丢包现象。
3.服务器发送完syn-ack确认包后,如果没有收到客户端的确认包,服务端会进行首次重传,等待一段时间后仍未收到,会进行二次重传,直至重传次数超过系统规定的重传次数,此时会将该连接信息从半连接队列中删除,一般每次重传的等待时间是指数增长,如:1s,2s,4s...。
4.第一次握手不能携带数据,如果有人恶意在请求报文中放大量数据,会使得服务器消耗大量时间、内存空间进行接受。第三次握手时,对客户端来说,已经知道服务端的接受、发送能力正常,所以就可以携带数据了。