TCP/IP协议

一、TCP/IP协议族
TCP/IP协议族是一个四层协议系统,自底而上分别是数据链路层、网络层、传输层和应用层。上层协议使用下层协议提供的服务。
这里写图片描述

1、数据链路层
数据链路层实现了网卡接口的网络驱动程序,处理数据在物理媒介(比如以太网)上的传输。
数据链路层两个常用的协议是ARP协议(Address Resolve Protocol,地址解析协议)和RARP协议(Reverse Address Resolve Protocol,逆地址解析协议)它们实现了IP地址和物理地址(MAC地址)之间的相互转换。
ARP协议工作原理:主机向自己所在的网络广播一个包含目标主机IP地址的ARP请求,此网络上的其他主机都会收到这个请求,但只有被请求的目标主机会回应一个包含自己物理地址的ARP应答。
网络层使用IP地址寻址一台机器,而数据链路层使用物理地址去寻址该台机器。但数据的通信最终依赖的是物理地址。这就是数据链路层为网络层提供的服务。

2、网络层
网络层实现数据包的选路和转发。
通信的两台主机一般不是直接连接的,而是通过 多个中间节点(路由器)连接的。网络层的任务就是选择这些中间节点,以确定两台主机之间的通信路径。

IP协议:
网络层最核心的协议是IP协议(Internet Protocol,因特网协议),IP协议根据数据包的目标IP地址来决定如何投递它。如果数据包不能直接发给目标主机,那么IP协议就为它寻找一个合适下一跳路由器,并将数据包交给该路由器来转发。多次重复该过程,数据包最终到达目标主机。可见,IP协议使用逐级跳的方式确定通信路径。

ICMP协议:
IP协议的重要补充,主要用于检查网络连接,ICMP报文分为两大类。
1. 差错报文:用来回应网络错误,比如目标不可以达到,和重定向。
2. 查询报文:用来查询网络信息,比如ping程序就是使用ICMP报文的。

3、传输层
传输层为两台主机上的应用程序提供端到端的通信。与网络层使用逐级跳的通信方式不同。传输层只关心通信的起始端和目的端,而不在乎数据包的传输过程。简单来说就是IP协议来找主机,TCP协议来找端口。

传输层协议主要有三个:TCP协议、UDP协议和SCTP协议

TCP协议(Transmission Control Protocol,传输控制协议)为应用层提供可靠的、面向连接和基于流(stream)的服务,数据大小没有限制。TCP协议使用超时传送、数据确认(当数据接收方收到发送方传来的信息时,会自动向发送方发出确认消息;发送方只有在接收到该确认消息之后才继续传送其它信息,否则将一直等待直到收到确认信息为止。)等方式来确保数据包被正确地发送至目的端,因此TCP服务是可靠的。
使用TCP协议通信的双方必须先建立TCP连接,并在内核中为连接维持一些必要的数据结构,比如连接的状态、读写缓冲区,以及诸多定时器等。当通信结束时,双方必须先关闭连接以释放这些内核数据。

运行在TCP协议上的协议:
HTTP(超文本传输协议),HTTPS,FTP(文件传输协议),SSH(Secure Shell,用于替代安全性差的TELNET,用于加密安全登陆用)。

UDP协议(User Datagram Protocol,用户数据报协议),与TCP协议完全相反,它为应用层提供不可靠、无连接和基于数据报的服务(数据大小有限制,64K,512字节)。
不可靠意味着UDP协议无法保证数据从发送端正确的传送到目的端。如果在从发送方到接收方的传递过程中出现数据报的丢失,协议本身并不能做出任何检测或提示。
UDP协议是无连接的,即通信双方不保持一个很长久的连接,因此发送方每次发送数据都要明确指定接收端地址(IP等信息)。所以UDP非常适合广播和多播。

既然UDP是一种不可靠的网络协议,那么还有什么使用价值或必要呢?其实不然,在有些情况下UDP协议可能会变得非常有用。因为UDP具有TCP所望尘莫及的速度优势。虽然TCP协议中植入了各种安全保障功能,但是在实际执行的过程中会占用大量的系统开销,无疑使速度受到严重的影响。反观UDP由于排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使速度得到了保证。

运行在UDP协议上的协议:
NTP(Network Time Protocol,网络时间协议),用于网络同步。
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),动态配置IP地址。

DNS既使用TCP又使用UDP:
UDP报文的最大长度为512字节,而TCP则允许报文长度超过512字节。当DNS查询超过512字节时,则使用TCP发送。

4、应用层
应用层负责众多逻辑,比如文件传输、网络管理等。数据链路层、网络层和传输层负责处理网络通信细节,这部分必须既稳定又高效,因此他们都在内核中实现。而应用层则是在用户空间实现的。

应用层协议和程序有很多,下面举几个常见的:
ping是应用程序,它利用ICMP报文检测网络连接,是调试网络环境的必备工具。
OSPF协议:一种动态路由更新协议,用于路由器之间的通信,以告知对方自己的路由信息。
DNS(Domain name Service)协议提供域名到IP地址的转换。

应用层协议(或程序)可能会跳过传输层直接使用网络的服务,比如ping程序和OSPF协议。应用层协议(或程序)通常可以使用TCP服务,又可以使用UDP服务,比如DNS协议。可以通过/etc/servives文件查看所有知名的应用层协议,以及它们对都能使用哪些传输层服务。

二、封装
上层协通过封来装实现使用下层协议提供的服务:
这里写图片描述
数据在在发送到物理网络之前,将沿着协议栈从上往下依次传递。每层协议都将在上层数据的基础上添加自己的头部信息(有时还包括尾部信息)以实现该层的功能,这个过程就称为封装。
经过TCP封装后交给IP模块之前的数据称为TCP报文(简称TCP段)。
经过IP封装后的数据称为IP数据报文,IP数据报也包括头部信息和数据部分,其中数据部分就是一个TCP报文段,UDP数据报或者ICMP报文。
经过数据链路层封装后的数据称为帧。传输媒介不同,帧的类型也不同。比如以太网上传输的的是以太网帧。

三、分用
当帧达到目的主机时,将沿着协议栈自底向下依次传递。各层协议依次处理帧中本层负责的头部数据,以获取所需的信息,并将最终的处理后的帧交给应用层的目标应用程序。这个过程称为分用。

四、socket和TCP/IP协议族的关系
数据链路层、网络层、传输层是在内核中实现的。因此操作系统需要实现一组系统调用,使得应用的程序能够访问这三层些协议提供的服务。实现这组系统调用的API(应用程序编程接口)叫做socket。

socket提供两点功能:
1. 将应用程序数据从用户空间复制到内核TCP/UDP发送缓冲区,或者从内核TCP/UDP接收缓冲区将数据复制到用户空间,以读取数据。
2. 应用程序可以通过socket去修改内核中各层协议的某些头部信息或者是其他数据结构。从而精细地控制底层通信行为。

二、IP协议

IP协议为上层协议提供无状态、无连接、不可靠的服务。

IPv4头部结构:
这里写图片描述无状态:
IP通信双方不同步传输数据的状态信息,因此所有IP数据报的发送、传输和接受都是相互独立的,没有上下文关系。
优点:简单,高效无须为保持通信状态而分配一些内核资源。比如UDP协议和HTTP协议都是无状态协议,一个浏览器的连续两次网页请求之间没有任何关联,它们将被Web服务器独立处理。

无连接:
IP通信双方都不长久地维持对方的任何信息。这样,上层协议每次发送数据的时候,都必须明确指定对方的IP地址。

不可靠:
IP协议不能保证IP数据报准确地到达接收端。因此IP协议的上层协议,比如TCP协议,需要自己实现数据确认、超时重传等机制以达到可靠传输的目的。

IPv4头部结构:
这里写图片描述
4位版本号,指定IP协议的版本,对于IPv4,其值是4。

16位总长度:IP数据报的长度,以字节为单位,最大长度为65535(2的l6次方减1),但由于MTU 的限制,长度超过MTU的数据报(长度远远小于最大值)都将被分片后传输。

下面三个字段描述如何分片
16位段标识:同一个数据报的所有分片中都具有相同的段标识值。

3位标志,第一位保留,第二位(DF)表示禁止分片(禁止后,如果IP数据长度超过帧的MTU,IP模块将丢弃该数据报并返回一个ICMP差错报文)。第三位(MF)表示更多分片

13位片偏移,指定分片的组合时的先后顺序。

8为生存时间(TTL):IP数据报达到目的地之前允许经过的路由器跳数。数据包转发过程中每经过一个路由,TTL值就会被减1,当TTL值减为0时,路由器将丢弃数据报,并向源端发送一个ICMP差错报文。TTL值可以防止数据陷入路由循环。

8位协议,用来区分上层协议,标记是基于TCP的还是UDP还是其他的协议。

16位头首部校验和,用来放校验码的,由发送端填充,接收端对其检验可以判断报文在传输过程中否被改变了。

三、TCP协议
使用TCP协议通信的双方必须先建立连接,然后才能开始数据的读写。双方都必须为连接分配必要的内核资源,用来管理TCP连接的状态和TCP连接上数据传输。
TCP连接是全双工的,即双方的数据读写可以通过一个连接进行。完成数据交换以后,通信双方都必须断开连接以释放系统资源。
TCP协议的这种连接是一对一的,所以基于广播和多播等,目标是多个主机地址的程序不能使用TCP服务。而无连接协议UDP则非常适合广播和多播。
TCP头部:
这里写图片描述

1、端口号:用来标识同一台计算机的不同的应用进程。
源端口:源端口和IP地址的作用是标识报文的返回地址。
目的端口:指明接收方计算机上的应用程序接口。
TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接。

2、序列号和确认号(都占4个字节):
这两个字段是TCP可靠传输服务的关键部分TCP把数据看成是有序的字节流,对数据流的每个字节进行编号。当报文被分解成多个报文段时,序列号seq就是报文段首字节在整个报文的偏移量。例如,一段报文的序号字段值是 301 ,而携带的数据共有100字段,显然下一个报文段(如果还有的话)的数据序号应该从401开始;
确定号ack指定下一个期待的字节。假设从主机A接收到主机B的数据,则主机A填充进报文段的确认号ack是主机A期望从主机B收到的下一个字节序号。确认号只有当ACK标志为1时才有效。比如建立连接时,SYN报文的ACK标志位为0。

3、数据偏移,占4位,它指出TCP报文的数据距离TCP报文段的起始处有多远

4、标志位:共6个
URG:紧急指针是否有效
指示报文段里存在着被发送方的上层实体标记为”紧急”数据,当URG=1时,其后的紧急指针指示紧急数据在当前数据段中的位置(相对于当前序列号的字节偏移量),TCP接收方必须通知上层实体。

ACK:确认标志
确认号只有当ACK标志为1时才有效。

PSH:推标志
当PSH=1时,接收方在收到数据后立即将数据交给上层,而不是直到整个缓冲区满。

RST:复位标志
复位标志有效。用于复位相应的TCP连接。

SYN:同步标志
在连接建立时用来同步序号。当SYN=1,ACK=0,表明是连接请求报文,若同意连接,则响应报文中应该使SYN=1,ACK=1;

FIN:结束标志
带有该标志置位的数据包用来结束一个TCP会话,但对应端口仍处于开放状态,准备接收后续数据。

16位窗口大小:
TCP流量控制的一个手段,告诉对方本端的TCP接收缓冲区还能容纳多少字节的数据。这样对方就可以控制发送数据的速度。

16为紧急指针:
发送端向接受数据端发送紧急数据的方法。

参靠文献
《Linux高性能服务编程》   机械工业出版社
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值