* 数据链路层:ARP,RARP * 网络层: IP,ICMP,IGMP * 传输层:TCP ,UDP,UGP * 应用层:Telnet,FTP,SMTP,SNMP,HTTP
ARP和RARP 是网络层的协议,可是它所工做的内容是链路层的。。。具体来讲应该是在网络层算法
应用层关注的是应用程序的细节,而不是数据在网络中的传输活动segmentfault
其余四层用来处理全部的通讯细节,对应用程序一无所知浏览器
一般包括操做系统的设备驱动程序和计算机对应的网络接口,它们一块儿处理与电缆(或者其余任何传输媒介)的物理接口细节。主要处理有关通讯媒介的细节(如以太网,令牌环网等)缓存
ARP地址解析协议和RARP逆地址解析协议是数据链路层协议,安全
是某些网络接口(如以太网和令牌环网)使用的特殊协议,用来转换IP层和链路层使用的地址服务器
包括IP网际协议,ICMP控制报文协议,IGMP组管理协议。
其中IP提供的是不可靠的服务,他只是负责尽量快地将分组从源节点送到目的节点。网络
ICMP是IP协议的附属协议,IP用ICMP来与其余主机或路由器交换错误报文和其余重要信息,虽然ICMP主要用于IP可是其余程序也能够访问ICMP数据结构
IGMP用来将一个UDP数据报多播到多个主机优化
传输层主要为两台主机上的应用程序提供端到端的通讯,在TCP/IP协议族中,有两个互不相同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。TCP相对安全稳定,可是UDP速度更快。spa
应用层负责处理特定的应用程序细节。几乎各类不一样的TCP/IP实现都会提供下面这些通用的应用程序:
Telnet远程登录 FTP文件传输协议 SMTP简单邮件传输协议 SNMP 简单网络管理协议
TCP主机之间经过握手进程互相创建起来一种虚拟链接。在握手期间,主机之间交换序号,当数据从一台主机发送到另外一台主机时序号便跟踪这些数据。
TCP把数据转换成连续的字节流,可是不能分辨出字节流的基础消息和消息边界。接收到字节流后,上层应用程序再把字节流解释成消息。
能够这么说:发送方将数据按协议封装成TCP数据包,接收方也按协议读取TCP数据包中的数据。
以太网标头
IP标头
TCP标头
以太网数据包的大小是固定的,1500字节的负载+22个字节的头信息=1522字节
IP数据包在以太网数据包的负载里面,它也有本身的头信息,最少须要20个字节,因此IP数据包的负载最多为1480字节
TCP数据包在IP数据包里面。除去头信息,它的最大负载时1460(但因为IP协议和TCP协议每每有额外的头信息,因此TCP实际负载为1440左右。所以,一条1500字节的信息须要两个 TCP 数据包。HTTP/2协议的一大改进就是压缩了HTTP协议的头信息,使得一个HTTP请求能够放在一个TCP数据包里,而不是分红多个,这样就提升了速度)
下图是TCP首部的数据结构
URG:紧急指针有效标志位,当它被置为1时,紧急指针才有效。 ACK:确认序号有效,当它被置为1时,确认序号才有效。 PSH:接受方应该尽快将这个报文交给应用层。 RST:重建链接。 SYN:同步序号用来发起一个新链接。 FIN:发端完成发送任务。
一个包1400字节,那么一次性发送大量数据,就必须分红多个包。好比,一个 10MB 的文件,须要发送7100多个包。
发送的时候,TCP 协议为每一个包编号(sequence number,简称 SEQ),以便接收的一方按照顺序还原。万一发生丢包,也能够知道丢失的是哪个包。
第一个包的编号是一个随机数。为了便于理解,这里就把它称为1号包。假定这个包的负载长度是100字节,那么能够推算出下一个包的编号应该是101。这就是说,每一个数据包均可以获得两个编号:自身的编号,以及下一个包的编号。接收方由此知道,应该按照什么顺序将它们还原成原始文件。
(图片说明:当前包的编号是45943,下一个数据包的编号是46183,由此可知,这个包的负载是240字节。)
收到 TCP 数据包之后,组装还原是操做系统完成的。应用程序不会直接处理 TCP 数据包。
对于应用程序来讲,不用关心数据通讯的细节。除非线路异常,收到的老是完整的数据。应用程序须要的数据放在 TCP 数据包里面,有本身的格式(好比 HTTP 协议)。
TCP 并无提供任何机制,表示原始文件的大小,这由应用层的协议来规定。好比,HTTP 协议就有一个头信息Content-Length,表示信息体的大小。对于操做系统来讲,就是持续地接收 TCP 数据包,将它们按照顺序组装好,一个包都很多。
操做系统不会去处理 TCP 数据包里面的数据。一旦组装好 TCP 数据包,就把它们转交给应用程序。TCP 数据包里面有一个端口(port)参数,就是用来指定转交给监听该端口的应用程序。
(图片说明:系统根据 TCP 数据包里面的端口,将组装好的数据转交给相应的应用程序。上图中,21端口是 FTP 服务器,25端口是 SMTP 服务,80端口是 Web 服务器。)
应用程序收到组装好的原始数据,以浏览器为例,就会根据 HTTP 协议的Content-Length字段正确读出一段段的数据。这也意味着,一次 TCP 通讯能够包括多个 HTTP 通讯。
TCP面向链接的传输是以两个主机间的握手开始的,一个主机发送到另外一个主机之间的握手有三个做用:
这三点做用,也正是三次链接的过程,也就是目的
第一步创建链接,后两步都是确认,可是第二次握手是收到SYN包,发送SYN+ACK包,第三次握手是收到第二次握手的SYN+ACK包,发送ACK包
三次握手_百度百科
TCP3次握手链接协议和4次握手断开链接协议 - Lostyears的专栏 - CSDN博客
只是由于TCP链接是全双工的,即数据可在两个方向上同时传递,因此关闭时每一个方向上都要单独关闭,这种单方向的关闭就叫半关闭。
这是由于服务端的LISTEN状态下的SOCKET当收到SYN报文的链接请求后,它能够把ACK和SYN(ACK起应答做用,而SYN起同步做用)放在一个报文里来发送。但关闭链接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你全部的数据都所有发送给对方了,因此你可能未必会立刻会关闭SOCKET,也即你可能还须要发送一些数据给对方以后,再发送FIN报文给对方来表示你赞成如今能够关闭链接了,因此它这里的ACK报文和FIN报文多数状况下都是分开发送的。
TCP为了实现网络通讯的可靠性使用了复杂的拥塞控制算法,创建了繁琐的握手过程 以及重传策略。
因为TCP内置在系统协议栈中,极难对其进行改进。
为了防止cwnd增长过快而致使网络拥塞,因此须要设置一个慢开始门限ssthresh状态变量(我也不知道这个究竟是什么,就认为他是一个拥塞控制的标识),它的用法:
1. 当cwnd > ssthresh,使用慢启动算法, 2. 当cwnd < ssthresh,使用拥塞控制算法,停用慢启动算法。 3. 当cwnd = ssthresh,这两个算法均可以。
服务器发送数据包,固然越快越好,最好一次性全发出去。可是,发得太快,就有可能丢包。带宽小、路由器过热、缓存溢出等许多因素都会致使丢包。线路很差的话,发得越快,丢得越多。
最理想的状态是,在线路容许的状况下,达到最高速率。可是咱们怎么知道,对方线路的理想速率是多少呢?答案就是慢慢试。
TCP 协议为了作到效率与可靠性的统一,设计了一个慢启动(slow start)机制。开始的时候,发送得较慢,而后根据丢包的状况,调整速率:若是不丢包,就加快发送速度;若是丢包,就下降发送速度。
Linux 内核里面设定了(常量TCP_INIT_CWND),刚开始通讯的时候,发送方一次性发送10个数据包,即"发送窗口"的大小为10。而后停下来,等待接收方的确认,再继续发送。
默认状况下,接收方每收到两个 TCP 数据包,就要发送一个确认消息。"确认"的英语是 acknowledgement,因此这个确认消息就简称 ACK。
ACK 携带两个信息。
期待要收到下一个数据包的编号 接收方的接收窗口的剩余容量
发送方有了这两个信息,再加上本身已经发出的数据包的最新编号,就会推测出接收方大概的接收速度,从而下降或增长发送速率。这被称为"发送窗口",这个窗口的大小是可变的。
(图片说明:每一个 ACK 都带有下一个数据包的编号,以及接收窗口的剩余容量。双方都会发送 ACK。)
注意,因为 TCP 通讯是双向的,因此双方都须要发送 ACK。两方的窗口大小,极可能是不同的。并且 ACK 只是很简单的几个字段,一般与数据合并在一个数据包里面发送。
(图片说明:上图一共4次通讯。第一次通讯,A 主机发给B 主机的数据包编号是1,长度是100字节,所以第二次通讯 B 主机的 ACK 编号是 1 + 100 = 101,第三次通讯 A 主机的数据包编号也是 101。同理,第二次通讯 B 主机发给 A 主机的数据包编号是1,长度是200字节,所以第三次通讯 A 主机的 ACK 是201,第四次通讯 B 主机的数据包编号也是201。)
即便对于带宽很大、线路很好的链接,TCP 也老是从10个数据包开始慢慢试,过了一段时间之后,才达到最高的传输速率。这就是 TCP 的慢启动。
TCP 协议能够保证数据通讯的完整性,这是怎么作到的?
前面说过,每个数据包都带有下一个数据包的编号。若是下一个数据包没有收到,那么 ACK 的编号就不会发生变化。
举例来讲,如今收到了4号包,可是没有收到5号包。ACK 就会记录,期待收到5号包。过了一段时间,5号包收到了,那么下一轮 ACK 会更新编号。若是5号包仍是没收到,可是收到了6号包或7号包,那么 ACK 里面的编号不会变化,老是显示5号包。这会致使大量重复内容的 ACK。
若是发送方发现收到三个连续的重复 ACK,或者超时了尚未收到任何 ACK,就会确认丢包,即5号包遗失了,从而再次发送这个包。经过这种机制,TCP 保证了不会有数据包丢失。
(图片说明:Host B 没有收到100号数据包,会连续发出相同的 ACK,触发 Host A 重发100号数据包。)
为何UDP有时比TCP更有优点 - 野狗科技官方专栏 - SegmentFault
可以对握手过程进行精简,减小网络通讯往返次数; 可以对TLS加解密过程进行优化; 收发快速,无阻塞。
TCP和UDP都以IP做为网络层协议,TCP和UDP的每组数据报都经过端系统和每一个中间路由器中的IP层在互联网中传输
UDP是无链接协议,TCP是面向链接的协议(两个对等端内部网之间直接创建逻辑链接)(咱们都说TCP是面向链接的传输协议,可是网络传输都是没有链接的,包括TCP也是同样。TCP所谓的“链接”,其实就是通信双方维护的一个“链接状态”,让它看上去像是有链接同样。因此,TCP的状态转移是很是重要的。)
TCP比UDP安全。TCP经过跟踪数据的传送,并确认和跟踪序号来确保它成功到达接收方。(TCP为了实现网络通讯的可靠性,使用了复杂的拥塞控制算法,创建了繁琐的握手过程以及重传策略。因为TCP内置在系统协议栈中,极难对其进行改进。)
相应的,UDP比TCP传输速度更快,实时性更高,网络带宽需求更小,功耗更低(虽然TCP协议中植入了各类安全保障功能,可是在实际执行的过程当中会占用大量的系统开销,无疑使速度受到严重的影响。反观UDP因为排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大下降了执行时间,使速度获得了保证。 )
QQ等即时通信软件使用UDP协议。移动端IM系统的协议选型:UDP仍是TCP? - 即时通信开发 - SegmentFault
DNS在进行区域传输的时候使用TCP协议,其它时候则使用UDP协议。DNS域名解析使用的是TCP协议仍是UDP协议? - 域名解析 - SegmentFault
流媒体
实时游戏
物联网
技术往事:改变世界的TCP/IP协议(珍贵多图、手机慎点) - 即时通信开发 - SegmentFault