标签:tcp/ip
TCP/IP网络协议栈分为应用层(Application)、传输层( Transport)、网络层(Network)和链路层(Link)四层。
1.数据链路层
实现了网卡接口的网络驱动程序。
协议:ARP协议和RARP协议
ARP协议:目标机器IP地址—(ARP协议)→ 目标机器MAC地址→ 目标机器
RARP协议:(无盘工作站)MAC地址—(RARP协议)→IP地址
2.网络层
实现数据包的选路和转发。负责点对点(point to point)的传输(“点”:主机或路由器)。网络层向上层协议隐藏了网络拓扑连接的细节,在传输层和应用层看来通信双方是直接相连的。
协议:IP协议,ICMP协议。
IP协议根据数据包的目的IP地址来决定如何投递它。如果数据包不能直接发给目的主机,那么IP协议就为它寻找合适的下一跳路由器,并将数据包交付给该路由器来转发。IP协议使用逐跳的方式确定通信路径。
ICMP协议是IP协议重要的补充,用于检测网络连接。
3.传输层
传输层为两台主机上的应用程序提供端到端(end to end)的通信。传输层只关心通信的起始端和目的端,而不在乎数据包的中转过程。
协议:TCP协议、UDP协议、SCTP协议
TCP协议 为应用层提供可靠的、面向连接和基于流(stream)的服务; | TCP协议使用超时重传、数据确定等方式确认数据报被正确地发送至目的端 | 使用TCP协议通信的双方必须先建立TCP连接,并在内核中为该连接维持一些必要的数据结构。通信结束时,双方必须关闭连接以释放这些内核数据。 | TCP协议是基于流的,数据没有边界(长度)限制。发送端可以逐个字节地向数据流中写入数据,接收端也可以逐个字节将其读出 |
UDP协议 为应用层提供不可靠、无连接、基于数据报的服务。 | UPD协议无法保证数据从发送端正确地传到目的端。使用UDP协议的应用程序通常要自己处理数据确认、超时重传等逻辑。 | UDP协议是无连接的,因此应用程序每次发送数据都要明确指定接收端的地址(IP地址等信息)。 | 每个UPD数据报都有一个长度,接收端必须以该长度为最小单位将其所有内容一次性读出,否则数据将被截断。 |
TCP是一种面向连接的,开放的协议,有点像打电话,双方拿起电话互通身份后就建立了连接,然后说话就行了,这边说话那边保证听得到,并且是按说话的顺序听到的,说完话挂机断开连接。也就是说TCP传输的双方需要首先建立连接,之后由TCP协议保证数据收发的可靠性,丢失的数据包自动重发,上层应用程序收到的总是可靠的数据流,通讯之后关闭连接。
UDP协议不面向连接,也不保证可靠性,有点像寄信,写好信放进邮筒里,既不能保证信件在邮递过程中不会丢失, 也不能保证信件是按顺序寄到目的地的。使用UDP协议的应用程序需要自己完成丢包重发、消息排序等工作。
SCTP协议是为了在因特网上传输电话信号而设计的。
4.应用层
负责处理应用程序的逻辑
应用层协议(或程序)可能跳过传输层直接使用网络层提供的服务,比如ping程序和OSPF协议。
应用层协议(或程序)通常既可以使用TCP服务,又可以使用UDP服务,比如DNS协议。
TCP/IP数据包的封装
以太网帧使用6字节(48位)的目的物理地址和6字节(48位)的源物理地址(MAC地址)来表示通信的双方。
协议类型字段有三种值,分别对应IP、ARP、RAPP。
以太网帧的数据长度规定最小46字节,最大1500字节,ARP和RARP数据包的长度不够46字节,要在后面补充填位。最大值1500称为以太网最大传输单元(MTU),不同的网络类型有不同的MTU,如果一个数据包从以太网路由到拨号链路上,数据包的长度大于拨号链路的MTU,则需要对数据包进行分片(fragment)传输。
帧末尾的4字节CRC字段对帧的其他部分提供循环冗余校验。
帧才是最终在网络上传送的字节序列。
TCP/IP数据包跨路由器通讯过程
数据链路层(驱动程序)封装了物理网络的电气细节;
网络层封装了网络连接的细节;
传输层则为应用程序封装了一条端对端的逻辑通信链路,它负责数据的收发、链路的超时重连等。
分用
当帧到达目的主机时 ,将沿着协议栈自底向上依次传递。各层协议依次处理帧中本层负责的头部数据,以获取所需的信息,并将处理后的帧交给目的应用程序。这个过程称为分用( demultiplexing)。
分用是依靠头部信息中的类型字段实现的。
整理自《Linux高性能服务器编程》第1章,《Linux C一站式学习》第36章
本文出自 “zgw285763054” 博客,请务必保留此出处http://zgw285763054.blog.51cto.com/11591804/1854152
标签:tcp/ip
原文地址:http://zgw285763054.blog.51cto.com/11591804/1854152