1、描述一下三次握手的过程
(1)由客户端发送建立TCP连接请求,其中包含由发送端随机产生的seq序列号x,将报文中的SYN字段设置为1,表示需要建立连接;
(2)服务端回复客户端的连接请求,包含回复端随机生成的seq序列号y,将SYN设置为1,产生ACK字段,ACK在客户端发送来的seq基础上+1回复;
(3)客户端在收到服务端的连接验证后,会使自己的seq序列号+1,并且再次回复ACK验证请求,在服务端发过来的seq上+1回复;
2、描述一下四次握手的过程
(1)客户端发送断开TCP连接的请求报文,报文包含发送端随机生成的seq序列号,且将报文中的FIN字段设置为1,表示需要断开连接;
(2)服务端回复客户端发送的报文,会产生ack字段,ack在客户端发来的seq基础上+1,且随机产生seq序列号;(以便客户端收到消息,知道自己的TCP断开请求得到验证,避免再次发送请求)
(3)服务端在回复完客户端后,不会马上进行TCP连接断开,服务端会先确保断开前,所有传输到A的数据是否已经传输完毕,一旦确认传输完毕,就会将回复报文的FIN字段设置为1,并随机产生序列号seq;
(4)客户端收到服务端的TCP断开请求后,会回复客户端的请求,ack是在服务端发来的seq基础上+1,且随机产生seq序列号,从而完成服务端的请求验证回复;
3、为什么要进行三次握手
(1)如果服务端直接创建了连接并返回数据包给客户端,这个数据包因为网络传输原因丢失了,导致客户端一直没有接收到,客户端可能设置了一个超时时间,时间到了就关闭连接创建的请求,而服务器并不知道客户端是否真正的接收到连接请求,服务器的端口就一直开着,而客户端因为超时严重又会重新发出请求,服务器就会重新开启一个端口连接,这样很多端口一直开着,造成服务器开销的严重浪费;
(2)已经失效的客户端发出请求信息,传输到服务端,服务端以为是客户端发出有效请求,接受后产生错误;
所以我们需要“第三次握手”来确认这个过程,让客户端和服务器端能够及时地察觉到因为网络等一些问题导致的连接创建失败,这样服务器端的端口就可以关闭了不用一直等待。
也可以这样理解:“第三次握手”是客户端向服务器端发送数据,这个数据就是要告诉服务器,客户端有没有收到服务器“第二次握手”时传过去的数据。若发送的这个数据是“收到了”的信息,接收后服务器就正常建立TCP连接,否则建立TCP连接失败,服务器关闭连接端口。由此减少服务器开销和接收到失效请求发生的错误。
4、客户端为什么在TIME_WAIT阶段等2MSL?
(1)目的:是确保服务器收到客户端发出的ACK确认报文
(2)原因:当客户端发出最后的ACK确认报文时,并不能确定服务端能够收到该报文,所以客户端在发送完ACK确认报文后,会设置一个时长为2MSL的计时器,MSL即Maximun Segment Lifetime, 一段TCP报文在传输过程中的最大生命周期,2MSL即是服务端发出为FIN报文和客户端发出ACK确认报文所能保持有效的最大时长;服务器在1MSL内没有收到客户端发出的ACK确认报文,就会再次向客户端发出FIN报文。
(3)补充:如果客户端在2MSL内,再次收到了来自服务器端的FIN报文,说明服务器端由于各种原因没有接收到客户端发出的ACK确认报文。客户端再次向服务器端发出ACK确认报文,计时器重置,重新开始2MSL的计时;否则客户端在2MSL内没有再次收到来自服务器端的FIN报文,说明服务器端正常接收了ACK确认报文,客户端可以进入CLOSED阶段,完成“四次挥手”。
相同点:都是控制丢包的作用,实现机制都是让发送方发的慢一点
不同点:控制的对象不同
(1)流量控制的对象是接收方,怕发送方发的太快,使接收方来不及处理;
(2)拥塞控制的对象是网络,怕发送方发的太快,造成网络拥塞,使得网络来不及处理;
1)存储位置,cookie是保存在客户端上的数据,session是保存在服务器上
2)存储方式,cookie只能保管ASCLL字段符串,session能够存储任何类型的数据
3)隐私方式,cookie只对客户端可见,session存储在服务器上,对客户端是透明的
4)存储容量,cookie保存的数据小,session没有上限