位码:
TCP有6种标示位,即位码,SYN(synchronous建立联机),ACK(acknowledgement 确认),PSH(push 传送),FIN(finish 结束),RST(reset 重置),URG(urgent紧急),Sequence number(顺序号),Acknowledge number(确认号)
握手过程:
第一次握手:主机A向主机B发送syn=1和随机产生的seq number = 12441234的数据包
第二次握手:主机B收到请求后确认建立联机信息,然后向A发送ack number = (主机A的seq+1), syn=1,ack = 1,随机产生seq = 7654321的包
第三次握手:主机A收到后检查主机B返回的ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再次发送ack number = (主机B seq number+1), ack = 1,主机B收到后确认seq值与ack=1则连接建立成功
最后完成连接
实例:
IP 192.168.1.116.3337 > 192.168.1.123.7788: S 3626544836:3626544836
IP 192.168.1.123.7788 > 192.168.1.116.3337: S 1739326486:1739326486 ack 3626544837
IP 192.168.1.116.3337 > 192.168.1.123.7788: ack 1739326487,ack 1
第一次握手:192.168.1.116的主机发送syn=1发出建立联机的请求,同时产生为3626544836的seq number
第二次握手:192.168.1.123的主机收到192.168.1.116发出的联机请求,向192.168.1.116发送ack number为3626544837,ack = 1,syn = 1,随机产生的seq 1739326486的包
第三次握手:192.168.1.116主机收到192.168.1.123主机返回的ack number是否正确及第一次发送的seq number+1,以及位码ack是否为1,若正确,则继续向192.168.1.123发送ack number = 1739326487,ack = 1的包,192.168.1.123收到包后确认seq = seq+1,ack = 1则建立连接成功
为什么要三次握手
如果只有两次握手的话,中间连接请求的数据报丢失,导致Client要重发一次请求; 这时Servlet端仅收到一个连接请求,因此可以正常连接; 但如果不是因为数据包丢失,而是因为阻塞了,这个情况下Server端将先后收到两次请求,并持续等待两个2个Client端请求向他发送数据,因此,Client端实际上只有一次请求,而Server端却有两个响应,这种情况可能导致Client端多次发送请求而导致Server端建立N多个响应在等待,因而造成极大资源浪费
为什么要四次挥手
- 双向通信
- 断开连接首先要先自己停止向Server端发送数据,并等待Server端的回复;但是之前建立的是平等连接,所以此时Server端也有主动权向Client端发送数据;故Server端也得主动发送数据,并等待Client端确认