Linux中的网络协议

OSI七层模型和TCP/IP五层模型

OSI七层模型

OSI(Open System Interconnection Reference Model),开放系统互联参考模型。
OSI是一个7层功能协议的结构,功能结构如下图所示。


image.png

从OSI模型来看,计算机发送数据时,数据会从高层向底层逐层传递,在传递过程中进行相应的封装,并最终通过物理层装换为光/电信号发送出去。计算机接受数据的时候,数据会从底层向高层逐层传递,并进行相应的解封装。

TCP/IP协议簇

TCP/IP模型是一个五层结构,具体结构如下图所示。


image.png

在OSI模型中我们习惯把每一层的数据单元都称为协议数据单元,例如第6层的数据单元叫做L6 pdu,第3层的数据单元称为L3 pdu,其中L表示层。
在TCP IP模型中,物理层的数据单元称为比特,把数据链路层的数据单元称为帧,把网络层的数据单元称为分组或包,对于传输层,我们习惯了把通过TCP封装而得到的数据单元称之为段。把通过udp封装而得到的数据单元称之为报文,对于应用层把HTTP封装而得到的数据单元称之为HTTP报文,把通过FTP封装而得到的数据单元称之为FTP报文。
OSI模型和TCP/IP 模型的区别是在于两者之间使用的协议不同。
在TCP/IP模型中最重要的两个协议就是tcp协议和ip协议

TCP三次握手四次挥手

TCP三次握手

TCP是一种可靠的传输协议,为什么说是可靠的呢?在使用TCP协议传输数据之前,需要现在两个通信端之间建立一条TCP连接,当TCP连接建立的时候就可以开始传输数据了。在数据传输完成之后,就会断开连接。

TCP连接建议需要经过三次握手。过程如下图


image.png

先来看看TCP报文的结构,其中SYN,ACK都是位于标志位的,包括其他的一些标志,seq是存在报文的序号字段中,ack是存在于报文的确认号字段里面,


image.png
  • 源端口、目标端口:计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口
    某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通
    信。源端口、目标端口是用16位表示的,可推算计算机的端口个数为2^16个,即65536
  • 序列号:表示本报文段所发送数据的第一个字节的编号。在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报文段称为结束报文段
    窗口大小:表示现在允许对方发送的数据量,也就是告诉对方,从本报文段的确认号开始允许对方
    发送的数据量,达到此值,需要ACK确认后才能再继续传送后面数据,由Window size value *
  • Window size scaling factor(此值在三次握手阶段TCP选项Window scale协商得到)得出此值
  • 校验和:提供额外的可靠性
  • 紧急指针:标记紧急数据在数据字段中的位置
  • 选项部分:其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表示,选项部分最长
    为:(2^4-1)*4-20=40字节

下面来说说具体过程。

第1步:客户端向服务器发送建立连接请求,并发送带有SYN标志的数据报文,其中客户端序列号随机生成的seq为x。
第2步:服务器收到客户端的请求之后会回应一个SYN+ACK的数据报文,其中seq=y,ack=x+1,其中服务器端序列号随机生成的seq是y,并且回复一个ack=x+1的确认号,以表示自己收到了客户端的请求消息,并且希望下一次发送的seq为x+1。
第3步:客户端收到来自服务器的回应消息后,再发送一个标志位为ACK的确认报文,其中序列号为x+1,确认号为y+1。满足上一步服务器要求发送的seq序列号,确认号ack则是希望下次收到来自服务器的消息的序列号是y+1.
通过上面的三个步骤,TCP连接便建立起来,这个方式也是被称为TCP的三次握手。

TCP四次挥手

image.png

TCP四次挥手
第一步 客户端发送FIN ACK控制段,表示传输已经完成,确认可以断开连接,其中序列号为seq=a
第二步 服务器端收到来自客户端的请求消息后,回应一个ACK确认字段 序号为seq=b,确认序列号为ack=a+1。
第三步 在回应来自客户端确认断开连接消息的同时也会向客户端发送一条自身也需要断开连接的确认消息FIN ACK控制段,其中序号为seq=c 确认序号为ack=a+1
第四步 客户端回应来自服务器端的断开连接请求,控制段为ACK,确认断开连接 其中seq=a+1 确认序号为ack=c+1。
至此,TCP四次挥手完毕,TCP连接断开.

TCP和UDP的区别

TCP 是面向连接的,建立通信需要经过三次握手,UDP 是面向无连接的,不许需要经过三次握手。
UDP程序结构较简单;如下图


image.png

TCP 是面向字节流的,UDP 是基于数据报的
TCP 保证数据正确性,UDP 可能丢包
TCP 保证数据顺序,UDP 不保证

你可能感兴趣的:(Linux中的网络协议)