五层协议
应用层、传输层、网络层、数据链路层、物理层
-
应用层:为特定应用程序提供数据传输服务,例如HTTP、DNS等协议。数据单位为报文。
-
传输层:为进程提供数据传输服务。【由于应用层协议很多,定义通用的传输层协议就可以支持不断增多的应用层协议。】
传输层包括两种协议:
- 传输控制协议TCP,提供面向连接、可靠的数据传输服务,数据单位为报文段。TCP主要提供完整性服务。
- 用户数据报协议UDP,提供无连接、尽最大努力的数据传输服务,数据单位为用户数据报。UDP主要提供及时性服务。
-
网络层:为主机提供数据传输服务。【传输层协议是为主机中的进程提供数据传输服务,网络层把传输层传递下来的报文段或者用户数据报封装成分组】
-
数据链路层:为同一链路的主机提供数据传输服务。网络层针对主机之间的数据传输服务,而主机之间可以由很多链路。【数据链路层把网络层传下来的分组封装成帧】
-
物理层:尽可能屏蔽传输媒体和通信手段的差异,使数据链路层感觉不到这些差异。【考虑的是怎样在传输媒体上传输数据比特流,而不是具体的传输媒体】
OSI七层模型
应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
其中剩下的两层,表示层和会话层用途如下:
- 表示层:进行数据压缩、加密、数据描述,这使得应用程序不必关心在各台主机中数据内部各式不同的问题。
- 会话层:建立及管理会话
五层协议中没有表示层和会话层,将这些功能留给应用程序开发者处理。
TCP/IP模型
应用层、传输层、网际层、网络接口层
TCP/IP体系结构不严格遵循OSI分层概念,应用层可能会直接使用IP层或者网络接口层。
TCP
传输控制协议TCP
- 面向连接的、可靠的、基于字节流的传输层通信协议
- 将应用层数据流分割为报文段并发送给目标结点的TCP层
- 数据包都有序号,对方收到则发送ACK确认,未收到则重传
- 使用校验和来检验数据在传输层过程中是否有误。
TCP报文格式
TCP的数据包
《主机A》
应用程序处理:
- 首先应用程序会进行编码处理,这些编码相当于OSI的表示层功能。
- 编码转化后,邮件不一定马上发送,对何时建立连接何时发送数据的管理功能,相当于OSI会话层功能。
TCP模块的处理
- TCP根据应用的指示,负责建立连接、发送数据、以及断开连接。TCP提供将应用层发来的数据顺利发送至对端的可靠传输
- 为了实现可靠传输,需要在应用层数据的前端附加一个TCP首部
《主机B》
网络接口(以太网驱动)的处理
- 注解收到以太网包后,首先从以太网包首部找到MAC地址判断是否为发送给自己的包,若不是则丢弃数据。
- 如果是,则从以太网包首部中的类型确定数据类型,再传给响应模块,如IP、ARP等。这里的例子是IP
IP模块的处理
- IP模块收到数据后做类似处理。从包首部中判断此IP地址是否与自己的IP地址匹配,如果匹配则根据首部的协议将数据转送给对应的模块,如TCP、UDP。这里的例子是TCP。
- 另外,对于有路由器的情况,接收端地址往往不是自己的地址,此时需要借助路由控制表,在调查应该送往的主机或路由器之后再进行转发处理。
TCP模块的处理
- TCP模块中,首先会计算一下校验和,判断数据是否被破坏。然后检查是否在按照序号接受数据。最后检查端口号,确定具体的应用程序。数据完整地接受以后,会传给端口号识别应用程序。
应用程序的处理
- 接收端应用程序会直接接收发送端发送的数据。通过解析数据,展示响应的内容。
TCP报头文:
- 源端口,目的端口:各占两个字节
- 序列号:占四个字节,因为字节流中每个字节都按顺序标号(seq)
- 确认号:占四个字节,是期望收到的下一个字节的序号(ack)
- Offset:指出TCP数据距离TCP报文的起始处有多远
- Reserved:保留域,默认为0
- TCP Flags:占一个字节
- Window:代表滑动窗口的大小,用来告知发送端接收端的缓存大小,以此控制发送端的发送速率,从而达到流量控制。
- 检验和:占两个字节
- 紧急指针:仅当URG为1时有效,指出报文的紧急数据的字节数
详细:
- 端口号、目标端口:计算机上的进程和其他进程通信要通过计算机端口,一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通信,源端口、目标端口是用16位表示的,可推算计算机的端口个数为216
- 序列号:表示本报文段所发送数据的第一个字节的编号。在TCP连接中所传送的字节流的每一个字节都会按顺序编号。由于序列号由32位表示,所以每232个字节,就会出现序列号回绕,再次从0开始
- 确认号:表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。也就是告诉发送方:我希望你(指发送方)下次发送的数据的第一个字节数据的编号为此确认号。
- 数据偏移:表示TCP报文段的首部长度,共4位,由于TCP首部包含一个长度可变的选项部分,需要指定这个TCP报文段到底有多长。它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。32位(4个字节),4位二进制最大表示15,所以书记处偏移量也就是TCP首部最大60字节。
- URG:表示本报文段中发送的数据是否包含紧急数据。后面的紧急指针字段只有当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报文段称为结束报文段
- 窗口大小:表示现在允许对方发送的数据量,也就是告诉对方,从本报文段的确认号开始允许对方发送的数据量,达到此值,需要ACK确认后才能继续传送后面的数据,由Window size value * Window size scaling factor(此值在三次握手阶段TCP选项Window scale协商得到)得出此值
- 校验和:提供额外的可靠性
- 紧急指针:标记紧急数据在数据段中的位置
- 选项部分:其最大长度可根据TCP首部长度进行推算。TCOP首部长度用4位表示,选项部分最长为(24-1)×4-20=40字节
- 常见选项:
最大报文段长度:Maxium Segment Size,MSS,通常1460字节
窗口扩大:Window Scale
时间戳: Timestamps
TCP Flags:
- URG:紧急指针标志
- ACK:确认序号标志(1表示有,0则忽略)
- PSH:push标志
- RST:重置连接标志
- SYN:同步序号,用于建立简介过程
- FIN:finish标志,用于释放连接
三次握手
三次握手指的是在发送数据的准备阶段,服务器与客户端需要进行三次交互。
具体过程:
- 第一次握手:建立连接时,客户端向服务器发送一个SYN包(握手信号,SYN=1, seq=x),并进入SYN_SENT状态,等待服务器确认。
- 第二次握手:服务器收到SYN包,必须确认客户端的SYN,同时自己也发送一个SYN包,即SYN+ACK包(接受到消息并相应,SYN=1,ACK=1, ack=x+1 ,seq=y)此时服务器进入SYN_SEND状态。
- 第三次握手:客户端收到服务器的SYN+ACK包(ACK=1,ack=y+1,seq=x+1),并向服务器发送确认包ACK,此包发送完毕,客户端和服务器进入Established状态。
TCP连接成功完成三次握手。
在上述三次握手协议中,服务器仍旧在维护一个未连接队列,等待其他客户端的连接请求,若能够完成三次握手,则服务器也可以与该客户端进行数据传输。
为什么三次握手才能建立连接
为了初始化Sequence Number的初始值
- 通信双方要通知给对方自己的初始化SequenceNumber,这个序列号要作为以后数据通信的序号,以保证传输层接收到的数据不会因为网络上的传输问题而乱序
- 即TCP会用这个序号来拼接数据,因此在服务器发回它的Sequence Number,即二次握手之后,还需要发送确认报文给服务器,告知客户端已经收到Sequence Numberl了。
为什么不是两次握手
- 进行两次握手,服务