Open cccreator opened 7 years ago
OSI七层模型-物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
TCP/IP参考模型-网络接口层、网际互联层、传输层、应用层 如图所示
相关用法Socket
第一次握手:客户端发送码为syn=1,随机产生seq number=1234567的数据包到server端,server端由SYN=1知道客户端要求建立联机;
第二次握手:server端收到请求后确认联机信息,向客户端发送ack number=1234568,syn=1,ack=1并随机产生seq=7654321的包;
第三次握手:客户端收到包后,检查ack number是否正确,即1234567+1,以及ack是否为1,若正确,客户端会再发送ack number=7654322,ack=1;server端收到后确认seq值与ack=1则连接成功;
ack:如果设置,该包包含确认;syn用于建立 同步信号
TCP三次握手对应的Socket API
connect发送了一个SYN,收到server的SYN+ACK后,代表连接完成。发送最后一个 ACK是protocol stack,tcp_out完成的;
listen在server端准备了一个未完成的连接列队,保存只收到SYN_C的socket结构。还准备了一个已完成的列队,保存了收到最后一个ACK的socket结构;
accept应用进程调用 accept的时候,就是去检查上面说的连接 列队,如果列队里有连接,就返回这个连接,如果没有,就睡眠等待;
客户端发送一个FIN,用来关闭客户端到服务器的数据传输;
服务器收到这个FIN,它发回一个ACK,确认序号=收到序号+1;
服务器关闭与客户端的连接,发送一个FIN给客户端;
客户端发回ACK确认,并将确认序号+1; 四次挥手图如下:
因为当server端收到client端的SYN连接请求后,可以直接发送SYN+ACK(其中ACK是用来应答的,SYN是用来同步的)。但关闭连接时,server端收到FIN报文后时,很有可能不会立即关掉SOCKET,所以只能回复一个ACK,告诉client端:报文收到,只有等server端所有报文都发送完了,我才能发送FIN报文。因此不能同时发送ACK+SYN。
应用层面的心跳机制:自定义心跳消息头,一般客户端主动发送到服务器,服务器接收后应答(或No),以便能够侦测连接是否断开;
TCP协议自带的保活功能:通过设置TCP keepalive的属性,打开socket的keepalive属性,并设置发送底层心跳包的时间间隔。我们调用socket是应用层 的函数,TCP keepalive是在底层定时发送心跳报文,服务器端收到底层的心跳报文直接丢弃,不关心其内容。
TCP/IP
OSI七层模型-物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
TCP/IP参考模型-网络接口层、网际互联层、传输层、应用层 如图所示
流式套接字的工作原理(TCP)
相关用法Socket
TCP的三次握手与四次挥手
关于TCP的三次握手
第一次握手:客户端发送码为syn=1,随机产生seq number=1234567的数据包到server端,server端由SYN=1知道客户端要求建立联机;
第二次握手:server端收到请求后确认联机信息,向客户端发送ack number=1234568,syn=1,ack=1并随机产生seq=7654321的包;
第三次握手:客户端收到包后,检查ack number是否正确,即1234567+1,以及ack是否为1,若正确,客户端会再发送ack number=7654322,ack=1;server端收到后确认seq值与ack=1则连接成功;
TCP三次握手对应的Socket API
connect发送了一个SYN,收到server的SYN+ACK后,代表连接完成。发送最后一个 ACK是protocol stack,tcp_out完成的;
listen在server端准备了一个未完成的连接列队,保存只收到SYN_C的socket结构。还准备了一个已完成的列队,保存了收到最后一个ACK的socket结构;
accept应用进程调用 accept的时候,就是去检查上面说的连接 列队,如果列队里有连接,就返回这个连接,如果没有,就睡眠等待;
关于TCP的四次挥手
客户端发送一个FIN,用来关闭客户端到服务器的数据传输;
服务器收到这个FIN,它发回一个ACK,确认序号=收到序号+1;
服务器关闭与客户端的连接,发送一个FIN给客户端;
客户端发回ACK确认,并将确认序号+1; 四次挥手图如下:
为什么连接的时候是三次握手,关闭的时候却是四次挥手?
因为当server端收到client端的SYN连接请求后,可以直接发送SYN+ACK(其中ACK是用来应答的,SYN是用来同步的)。但关闭连接时,server端收到FIN报文后时,很有可能不会立即关掉SOCKET,所以只能回复一个ACK,告诉client端:报文收到,只有等server端所有报文都发送完了,我才能发送FIN报文。因此不能同时发送ACK+SYN。