学习C++socket通信,先复习下计算机网络里的一些知识。
OSI即Open System Interconnection(开放式系统互联),它提供了一个网络中计算机通信网络系统结构模型的参考。
OSI共有七层。
OSI协议 | 功能 |
应用层 | 文件传输,文件服务,电子邮件,虚拟终端 |
表示层 |
数据格式化,数据加密,代码转换 |
会话层 |
解除或建立与其他节点的联系 |
传输层 |
提供端对端的接口 |
网络层 |
为数据包选择路由 |
数据链路层 |
帧传输,错误检测 |
物理层 |
传输二进制数据 |
TCP/IP参考模型是计算机网络的祖父ARPANET和其后继的因特网使用的参考模型。有四层结构。
1.应用层对应OSI的5、6、7层。
2.传输层对应osi的传输层。有两个重要的协议(TCP和UDP)。TCP是连接的、可靠的通信协议,而UDP是无连接的、不保证可靠的通信协议,即尽最大努力交付。
3.网际互联层(图中的网络互连层)对应OSI的网络层。主要解决主机到主机的通信问题。。该层有三个主要协议:网际协议(IP)、互联网组管理协议(IGMP)和互联网控制报文协议(ICMP)。IP协议是网际互联层最重要的协议,它提供的是一个可靠、无连接的数据报传递服务。
TCP的3次握手
ACK : TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1
SYN(SYNchronization) : 在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此, SYN置1就表示这是一个连接请求或连接接受报文。
第一步:客户端向服务器端发起连接请求,发送syn包到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
seq是序号。
第二步:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三步::客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手,就可以传输数据了。
TCP断开连接:
第一步:客户端没有数据需要发送,发送一个FIN包(即使没数据也占用一个序号)请求断开连接。
第二步:服务端对客户端发送的信息进行确认。发送一个ACK包。(此时可能服务端还有数据需要发送)
第三步:服务端发送完需要发送的数据后,发送FIN包和ACK包,确认序号和上一个ack一样,此时为半关闭状态。
第四步:客户端收到消息,发送ACK包,等待2MSL后,关闭连接。MSL(maximum segment lifetime)是一个数据报在网络中单向发出到认定丢失的时间,一个数据报有可能在发送图中或是其响应过程中成为残余数据报,确认一个数据报及其响应的丢弃的需要两倍的MSL.