接着昨天的话题,继续面试题的整理。因为那次实在是被虐哭了。
这图不错,虽然有点看不懂,当关键是清晰直观一点
http发出一次请求,tcp建立连接。目的还是为了建立可靠的连接服务,三次握手进行初始化。(我感觉就像是拿上话筒,想吹吹,试试好坏)。确保连接双方的序列号和确认号并交换TCP信息。
1.第一次握手:建立连接。
客户端发送连接请求报文段,将SYN置为1,Squence Number为x;客户端进入SYN_SEND状态,等待服务器确认。
2.第二次握手:服务器收到SYN报文段,并处理
服务器收到报文段,需要进行确认,设置Acknowledgement Number为x+1(x同上);同时,客户端也要发送SYN请求信息,将SYN置为1,Sequence Number 为y; 如武器将以上操作的所有内容都放到一个报文段(SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;
3.第三次握手:客户端收到服务器SYN+ACK报文段,并处理
客户端收到服务器的信息后,将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,完了后,客户端和服务器端都进入ESTABLISHED状态,完成三次握手。——开始传送数据
四次挥手:
TCP断开连接
1.第一次挥手:主机A(客户端或服务器端),设置Sequence Number和Acknowledment Number,向另一方主机B发送FIN报文段;主机A进入FIN_WAIT_1状态,表示没有数据要发送给B了。
2.第二次挥手:B收到了A发送的FIN报文段,向A回一个ACK报文段,Acknowledgment Number为Sequence Number+1;A进入FIN_WAIT_2状态;B告诉A,同样没有数据要发送给了,可以关闭连接。
3.第三次挥手:B向A发送FIN报文段,请求关闭连接,且B进入CLOSE_WAIT状态;
4.第四次挥手:A收到B发送的FIN报文段,向B发送ACK报文段,A进入TIME_WAIT状态;B收到A的ACK报文段后,关闭连接;A等待2MSL(时间)后依旧没收到回复,A也会关闭连接。
其实吧,我感觉下一次再问到同样的问题,我可能依旧回答的不会很好,但是收获一个只是总是令人开心的。知道大概流程,按照关键字记忆,总能说出个一二来的
为什么要三次握手
为了防止已失效的连接请求突然又传送到服务端,产生错误
——《计算机网络》
有这么一种情况,client发出的第一个连接请求报文段没有丢失,但是在某个网络节点长时间滞留了,到了很久的时间段后才到达server。这是一个已经失效的报文段,但server收到该请求报文段后,错误的认为这个是client再次发出一个新的请求,于是就像client发出确认报文段,同意连接。
如果不采用“三次握手”,只要发出确认,新连接就建立。由于client在这一时段没有建立连接的请求,因此不理睬server,不向server发送数据。而server已经建立连接了,并一直等待client的数据,这样server的很多资源就被浪费了。
为什么四次挥手
tcp协议是一种面向连接的,可靠的,基于字节流的运输层通信协议,是全双工模式(呵呵)
这个我看不懂,另找的一个答案。
关闭连接时,server段收到FIN报文,很可能并不会立即关闭SOCKET,只能先回复一个ACK报文,告诉CLIENT,我收到了你的报文。只有当server报文都发送完了,确认没有报文需要发送之后,才能关闭连接,需要四次挥手完成关闭连接的操作。
身为计算机专业的学生,居然不是通过课本学会的,是通过网络获取的学会的,惭愧啊……
计算操作系统,计算机网络,计算机导论,计算机组成原理
是不是突然又回到了校园,好怀念那时的浪啊浪——
参考地址:
https://www.cnblogs.com/shihaochangeworld/p/5770294.html
https://blog.csdn.net/a987073381/article/details/52206215
都是大牛