物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
==========================================
物理层
作用:定义一些电器,机械,过程和规范,如集线器;
PDU(协议数据单元):bit/比特
设备:集线器HUB;
注意:没有寻址的概念;
==========================================
数据链路层
作用:定义如何格式化数据,支持错误检测;
典型协议:以太网,帧中继(古董级VPN)
PDU:frame(帧)设备:以太网交换机;
备注:交换机通过MAC地址转发数据,逻辑链路控制;
===========================================
网络层
作用:定义一个逻辑的寻址,选择最佳路径传输,路由数据包;
典型协议:IP,IPX,ICMP,ARP(IP->MAC),IARP;
PDU:packet/数据包;
设备:路由器
备注:实现寻址
============================================
传输层:
作用:提供可靠和尽力而为的传输;
典型协议:TCP,UDP,SPX,port(65535个端口),EIGRP,OSPF,
PDU:fragment 段;
无典型设备;
备注:负责网络传输和会话建立;
=============================================
会话层:
作用:控制会话,建立管理终止应用程序会话;
典型协议:NFS, SQL, ASP, PHP, JSP, RSVP(资源源预留协议), windows,
备注:负责会话建立;
==============================================
表示层:
作用:格式化数据;
典型协议:ASCII, JPEG. PNG, MP3. WAV, AVI,
备注:可以提供加密服务;
===============================================
应用层:
作用:控制应用程序;
典型协议:telnet, ssh, http, ftp, smtp, rip, BGP, (未完待续)
备注:为应用程序提供网络服务;
当和别人通信时才有PDU
我们一般知道OSI的网络参考模型是分为7层:“应表会传网数物”——应用层,表示层,会话层,传输层,网络层,数据链路层,物理层。而实际的Linux网络层协议是参照了OSI标准,但是它实现为4层:应用层,传输层,网络层,网络接口层。OSI的多层对应到了实际实现中的一层。我们最为关注的是传输层和网络层。一般而言网络层也就是IP层,负责IP路由寻址等等细节,而传输层TCP/UDP负责数据的可靠/快速的传输功能。
网络的实际运行过程就是发送方,从高层向底层,根据协议对数据进行一层一层的封包,每一层加上该层协议的header;而接收方,从底层向高层,不断的解封数据包,每一层去掉该层的协议的header,然后最高层的应用层得到应用层数据:
每一层添加的 Header(TCP/UDP Header, IP Header, Data Link Header) 都是为了实现该层协议服务而必须存在的协议相关数据。
2. Socket Buffer
发生方发送数据,接收方接受数据,那么双方必须存在一个保存数据的buffer,称为Socket Buffer,TCP/IP的实现都是放在kernel中的,所以Socket Buffer也是在kernel中的。Socket Buffer的大小配置对网络的性能有很大的影响,相关参数如下:
1)/proc/sys/net/ipv4/tcp_mem: 这是一个系统全局参数,表示所有TCP的buffer配置。有三个值,单位为内存页(通常为4K),第一个值buffer值的下限,第二个值表示内存压力模式开始对buffer应于压力的上限;第三个值内存使用的上限,超过时,可能会丢弃报文。
2)/proc/sys/net/ipv4/tcp_rmen: r 表示receive,也有三个值,第一个值为TCP接收buffer的最少字节数;第二个是默认值(该值会被rmem_default覆盖);第三个值TCP接收buffer的最大字节数(该值会被rmem_max覆盖);
3)/proc/sys/net/ipv4/tcp_wmem: w表示write,也就是send。也有三个值,第一个值为TCP发送buffer的最少字节数;第二个是默认值(该值会被wmem_default覆盖);第三个值TCP发送buffer的最大字节数(该值会被wmem_max覆盖);
4)/proc/sys/net/core/wmem_default: TCP数据发送窗口默认字节数;
5)/proc/sys/net/core/wmem_max: TCP数据发送窗口最大字节数;
6)/proc/sys/net/core/rmem_default: TCP数据接收窗口默认字节数;
7)/proc/sys/net/core/rmem_max: TCP数据接收窗口最大字节数;
注意:除了tcp_mem单位为内存页之外,其它几个单位都是字节;而且tcp_mem是全局配置,其它几个都是针对每一个TCP连接的配置参数。
1.TCP/IP(Transmission Control Protocol/Internet Protocol)是用于因特网(Internet)的通信协议。它供已连接因特网的计算机进行通信的通信协议,并且定义了电子设备(计算机)如何连入因特网以及数据如何在他们之间传输的标准。
2.在TCP/IP内部包含了一系列用于处理数据通信的协议:
TCP(传输控制协议)-应用程序之间的通信UDP(用户数据报协议)-应用程序之间的简单通信IP(网际协议)-计算机之间的通信ICMP(因特网消息控制协议)-针对错误和状态DHCP(动态主机配置协议)-针对动态寻址3.TCP使用固定的连接
当应用程序希望通过TCP与另一个应用程序通信时,他会发送一个通信请求。这个请求必须被送到一个确切的地址。在双方“握手”之后,TCP将在两个应用程序之间建立一个全双工(full-duplex)的通信。这个全双工通信将占用两个计算机之间的通信线路,直到它被一方或双方关闭为止。UDP和TCP相似,但是更简单,同事可靠性低于TCP。
4.IP是无连接的
IP是无连接的通信协议。它不会占用两个正在通信的计算机之间的通信线路。这样,IP就降低了对网络线路的需求。每条线可以同事满足许多不同的计算机之间的通信需要。通过IP,消息(或其它数据)被分割为小的独立的包,并通过因特网在计算机之间传送。IP负责将每个包路由到它的目的地。
5.IP路由器
当一个IP包从一台计算机被发送,它会到达一个IP路由器。IP路由器负责将这个包路由到它的目的地,直接地或通过其它的路由器。在一个相同的通信中,一个包所有得来丼可能会和其它的包不同。而路由器负责根据通信量、网络中的或者其它参数进行正确寻址。
6.TCP/IP
TCP/IP即TCP和IP一起协同工作。TCP负责应用软件和网路软件之间的通信。IP负责计算机之间的通信。
TCP负责将数据分割并装入IP包,然后在它们到达的时候进行重新组合它们。IP负责将包发送至接受者。
7.TCP/IP域名
由于TCP/IP地址难于记忆,域名就出现了。
用于TCP/IP地址的名字称为域名。runoob.com就是一个域名。当你键入一个像http://www.runoob.com这样的域名,域名会被一种DNS程序翻译为数字地址。
在全世界,数量庞大的 DNS 服务器被连入因特网。DNS 服务器负责将域名翻译为 TCP/IP 地址,同时负责使用新的域名信息更新彼此的系统。当一个新的域名连同其 TCP/IP 地址一起注册后,全世界的 DNS 服务器都会对此信息进行更新。
TCP/IP协议是Internet最基本的协议。由传输层的TCP协议和网络层的IP协议组成。
TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台联网设备规定一个地址。
TCP/IP协议族按层次分别分为以下4层:应用层、传输层、网络层和数据链路层。
应用层
应用层决定了向用户提供应该服务时通信的活动。
TCP/IP协议族内预存了各类通用的应用服务。比如,FTP(File Transfer Protocol,文件传输协议)和DNS(Domain Name System,域名系统)服务就是其中的两类。HTTP协议也处于该层。
传输层
传输层对上层应用层,提供处于网络连接中两台计算机之间的数据传输。
在传输层有两个性质不同的协议:TCP(Transmission Control Protocol,传输控制协议)和UDP(User Data Protocol,用户数据报协议)。
网络层(又名网络互连层)
网络层用来处理在网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径(所谓的传输路线)到达对方计算机,并把数据包传送给对方。
与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的所用就是在众多的选项内选择一条传输路线。
链路层(又名数据链路层,网络接口层)
用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等物理可见部分(还包括连接器等一切传输媒介)。硬件上的范畴均在链路层的作用范围之内。
简单归纳下各层的协议:
详见维基百科:https://zh.wikipedia.org/wiki/用户数据报协议
UDP(User Datagram Protocol)即用户数据报协议,,是一个简单的面向数据报的传输层协议,正式规范为RFC 768。
在TCP/IP模型中,UDP为网络层以上和应用层以下提供了一个简单的接口。UDP只提供数据的不可靠传递,它一旦把应用程序发给网络层的数据发送出去,不保留数据备份。
UDP报文结构:
优点——快。 缺点——不可靠、不稳定。
UDP:无连接,发送数据之前不需要建立连接(TCP需要)。减少了开销和延时。
UDP:面向报文,对IP数据报只做简单封装(8字节UDP报头)。减少报头开销。
UDP:没有阻塞机制,宁愿阻塞时丢弃数据不传,也不阻塞造成延时。
UDP支持一对一、一对多、多对一、多对多通信。
UDP与TCP位于同一层,但它不管数据包的顺序、错误或重发。因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询---应答的服务,例如NFS。相对于FTP或Telnet,这些服务需要交换的信息量较小。
UDP协议包括:TFTP(简单文件传输协议)、SNMP(简单网络管理协议)、DNS(域名解析协议)、NFS、BOOTP。
详见维基百科:https://zh.wikipedia.org/wiki/传输控制协议
TCP(Transmission Control Protocol)传输控制协议,相对于UDP,TCP是面向连接的、提供可靠的数据传输服务。同时也是较UDP开销较大的、传输速度较慢的。
区别:
UDP:单个数据报,不用建立连接,简单,不可靠,会丢包,会乱序;
TCP:流式,需要建立连接,复杂,可靠 ,有序。
TCP报文结构:
TCP是点对点的连接。一条TCP连接只能连接两个端点。
TCP 提供可靠传输,无差错、不丢失、不重复、按顺序。
TCP 提供全双工通信,允许通信双方任何时候都能发送数据,发送方设有发送缓存,接收方设有接收缓存。
TCP 面向字节流 。TCP 并不知道所传输的数据的含义,仅把数据看作一连串的字节序列,它也不保证接收方收到的数据块和发送方发出的数据块具有大小对应关系。
TCP的协议:FTP(文件传输协议)、Telnet(远程登录协议)、SMTP(简单邮件传输协议)、POP3(和SMTP相对,用于接收邮件)、HTTP协议等。
TCP提供可靠的、面向连接的数据传输服务。使用TCP通信之前,需要进行“三次握手”建立连接,通信结束后还要使用“四次挥手”断开连接。
注:seq:(Sequence Number):本报文段数据的第一个字节的序号
ack:(Acknowledgment Number):确认号——期望收到对方下个报文段的第一个数据字节的序号
SYN(synchronize):请求同步标志——用于建立和释放连接,当SYN=1时,表示建立连接。
ACK(acknowledge):确认标志——仅当 ACK=1时确认号字段才有效。建立 TCP 连接后,所有报文段都必须把 ACK 字段置为 1。
FIN(Finally):结束标志——用于释放连接,当 FIN=1,表明发送方已经发送完毕,要求释放TCP连接。
1、第一次握手:客户端向服务器端发送连接请求包SYN=1(seq=x),等待服务器回应;
2、第二次握手:服务器端收到请求包后,将客户端的请求包SYN=1(seq=x)放入到自己的未连接队列,此时服务器需要发送两个包给客户端:
(1)向客户端发送确认自己收到其连接请求的确认包ACK=1(ack=x+1),向客户端表明已知道了其连接请求
(2)向客户端发送连接询问请求包SYN=1(seq=y),询问客户端是否已经准备好建立连接,进行数据通信;
此时服务器进入SYN_RECV状态。
3、第三次握手:客户端收到服务器的包后,知道服务器同意建立连接;向服务器发送连接建立的确认包ACK=1(ack=y+1),回应服务器的SYN(seq=y)告诉服务器,我们之间已经建立了连接,可以进行数据通信。
ACK=1(ack=y+1)包发送完毕,服务器收到后,此时服务器与客户端进入ESTABLISHED状态,开始进行数据传送。
握手的过程实际上是在通知对方自己的初始化序号(Initial Sequence Number),简称ISN,也就是上图中的x和y。x和y会被当作之后传输数据的一个依据,以保证TCP报文在传输过程中不会混乱。
解决两个问题:
1、避免连接请求的数据包丢失
假设连接途中,客户端网络不稳定出现丢包,服务端根据seq=x来确定客户端请求到第几个包。然后告诉客户端你从第seq=x个包开始发送给我,之前的不用发送了,我这里有记录了。
2、数据传输过程因为网络并发量很大在某结点被阻塞
传输过程因为网络并发量很大在某结点被阻塞了,Server端将先后收到2次请求,并持续等待两个Client请求向他发送数据,但是Cient端实际上只有一次请求,而Server端却有2个响应,极端的情况可能由于Client端多次重新发送请求数据而导致Server端最后建立了N多个响应在等待,因而造成极大的资源浪费!
三次握手的seq与ack确定了包的顺序。客户端每次请求时,询问服务端说这是第一号包,服务端收到后告诉客服端下次你给我的只能是二号包(别的都不要),同时给返回到客户端的包作标记:这是我返回给你的一号包。这样,出现阻塞时,根据包的序号就知道要响应的是几号包。
(1)Client向Server发送断开连接请求的报文段,seq=m(m为Client最后一次向Server发送报文段的最后一个字节序号加1),Client进入FIN-WAIT-1状态。
(2)Server收到断开报文段后,向Client发送确认报文段,seq=n(n为Server最后一次向Client发送报文段的最后一个字节序号加1),ack=m+1,Server进入CLOSE-WAIT状态。此时这个TCP连接处于半开半闭状态,Server发送数据的话,Client仍然可以接收到。
(3)Server向Client发送断开确认报文段,seq=u(u为半开半闭状态下Server最后一次向Client发送报文段的最后一个字节序号加1),ack=m+1,Server进入LAST-ACK状态。
(4)Client收到Server的断开确认报文段后,向Server发送确认断开报文,seq=m+1,ack=u+1,Client进入TIME-WAIT状态。
(5)Server收到Client的确认断开报文,进入CLOSED状态,断开了TCP连接。
(6)Client在TIME-WAIT状态等待一段时间(时间为2*MSL((Maximum Segment Life)),确认Client向Server发送的最后一次断开确认到达(如果没有到达,Server会重发步骤(3)中的断开确认报文段给Client,告诉Client你的最后一次确认断开没有收到)。如果Client在TIME-WAIT过程中没有再次收到Server的报文段,就进入CLOSES状态。TCP连接至此断开。
tcp关闭连接需要四次握手原因:TCP连接是全双工通道,需要双向关闭。
client向server发送关闭请求,表示client不再发送数据,server响应。此时server端仍然可以向client发送数据,待server端发送数据结束后,就向client发送关闭请求,然后client确认。