网络连接的三次握手及四次握手
一个数据从一台主机传输到另一台主机,看似平淡无奇,但是稍微了解就知道其底层其实是非常复杂的,下面我们说一下OSI(Open System Interconnection)开放系统互连,一个数据要经过7个过程的层层打包,然后到对方电脑后再层层解包来完成。
第一层:物理层(physical)也是最底层了,把打包好的数据通过二进制进行传输。为启动、维护以及关闭物理链定义了电气规范、机械规范、过程规范和功能规范。
第二层:数据链路层(data link)访问介质,定义如何格式化数据以便进行传输以及如何控制对网络的访问;支持错误检测。
第三层:网络层(network)数据传输(路由器数据包;选择传递数据的最佳路径;支持逻辑寻址和路径选择)
第四层:传输层(transport)传输问题(确保数据传输的可靠性;建立、维护和终止虚拟电路;通过错误检测和恢复;信息流控制来保障可靠性)
第五层:会话层(session)主机间建立、管理和终止在应用程序之间会话
第六层:表示层(presention)数据表示(确保接收系统可以读出该数据;格式化数据;构建数据;协商用于应用层的数据传输语法;提供加密)
第七层:应用层(application)为应用进程(例如,电子邮件、文件传输和终端仿真)提供昂罗服务;提供用户身份验证。
PDU: (Protocol Data Unit)协议数据单元是指对等层次之间传递的数据单位;物理层的PDU是数数据位(bit);在数据链路层是数据帧(frame);在网络层是数据包(packet);在传输层是数据段(segment);在其它更高层次是消息(message)。
集线器属于OSI的第一层物理层设备,而网桥属于OSI的第二层数据链路层设备,从工作方式来看,集线器是一种广播模式,所有端口在一个冲突域里面,而网桥可以通过端口隔离冲突。
Hub是所有共享总线和共享宽带。网桥的每个端口占一个宽带。
路由器是为了实现路由分隔广播域;选择路由表中到达目标最好的路径;维护和检查路由信息;连接广域网的作用。
路由就是把一个数据包从一个设备发送到不同网络的另一台设备上去,当然这些工作依靠路由器来完成。路由器只关心网络状态和选择最佳路径,路由的实现依靠路由器中的路由表来完成。
TCP
TCP总共定义为四层,工作在传输层
TCP包头
源端口、目标端口:计算机上的进程要和其他进程通信是要通过计算机端口的,
而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标
端口,就可以知道是哪两个进程需要通信。源端口、目标端口是用16位表示的,
可推算计算机的端口个数为2^16个
序列号:表示本报文段所发送数据的第一个字节的编号。在TCP连接中所传送的
字节流的每一个字节都会按顺序编号。由于序列号由32位表示,所以每2^32个
字节,就会出现序列号回绕,再次从 0 开始
确认号:表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。
也就是告诉发送方:我希望你(指发送方)下次发送的数据的第一个字节数据
的编号为此确认号
数据偏移:表示TCP报文段的首部长度,共4位,由于TCP首部包含一个长度可
变的选项部分,需要指定这个TCP报文段到底有多长。它指出 TCP 报文段的数
据起始处距离 TCP 报文段的起始处有多远。该字段的单位是32位(即4个字节为
计算单位),4位二进制最大表示15,所以数据偏移也就是TCP首部最大60字节
URG:表示本报文段中发送的数据是否包含紧急数据。后面的紧急指针字段(urgent
pointer)只有当URG=1时才有效
ACK:表示是否前面确认号字段是否有效。只有当ACK=1时,前面的确认号字段才有效。
TCP规定,连接建立后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段
PSH:提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空
间。如果为1,则表示对方应当立即把数据提交给上层应用,而不是缓存起来,如果应用程序
不将接收到的数据读走,就会一直停留在TCP接收缓冲区中
RST:如果收到一个RST=1的报文,说明与主机的连接出现了严重错误(如主机崩溃),必
须释放连接,然后再重新建立连接。或者说明上次发送给主机的数据有问题,主机拒绝响应,
带RST标志的TCP报文段称为复位报文段
SYN:在建立连接时使用,用来同步序号。当SYN=1,ACK=0时,表示这是一个请求建立连
接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求
建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1,带SYN标志的TCP报文
段称为同步报文段
FIN:表示通知对方本端要关闭连接了,标记数据是否发送完毕。如果FIN=1,即告诉对方:
“我的数据已经发送完毕,你可以释放连接了”,带FIN标志的TCP报文段称为结束报文段
三次握手
开始客户端和服务器端都是处于关闭状态,首先客户端首先进行第一次握手“SYN=1,seq=x”
;如果服务器接收到了,它要回复点东西给客户端好让它知道自己收到它的信息了,那就是第二次握手“SYN=1,ACK=1,seq=y,ack=x+1”
。最后客户端收到服务端的信息后再发送自己的请求来实现第三次握手“ACK=1,seq=x+1,ack=y+1"
.然后客户端和服务器端就可以进行正常通信了。(第一次握手肯定是客户端发送的,服务器不会主动握手客户端的哦)
四次挥手
首先来说挥手可能不是四次,可能是三次也可能根本来不及握手···。因为终止连接可以是客户端提出的也可以是服务器端提出的,更可以是同时提出。当然也有种情况那就是他俩谁也没想终连接受外界影响终止了,例如停电···。那这里我们之说正常一点的 ,客户端主动提出终止连接。首先客户端第一次挥手“FIN=1,seq=u”
发送后客户端进入等待终止1的模式。服务器收到后先把没传送完的数据再传送一波进行第二次挥手“ACK=1,seq=v,ack=u+1”
收到这个信息收客户端继续等待服务器端发送信息传输完成的信息并且客户进入等待终止2的状态。服务器发送了那条信息后通知应用进程传输完成立即关闭然后进行第三次握手“FIN=1,ACK=1,seq=w,ack=u+1”
然后进入等待客户端最后确认的命令。当客户端收到这条信息后然后立马确认关闭并且发送了一条信息给服务器进行了第四次握手“ACK=1,seq=u+1,ack=w+1”
。OK到此为止完成了四次挥手双方断开了链接变成了陌路人。
原文地址:https://blog.51cto.com/14322562/2405595