第一层: 物理层
第二层: 数据链路层 802.2,802.3ATM,HDLC,FRAME RELAY
第三层: 网络层 IP,IPX,ARP,APPLETALK,ICMP
第四层: 传输层 TCP,UDP,SPX
第五层: 会话层 RPC,SQL,NFS ,X WINDOWS,ASP
第六层: 表示层 ASCLL,PICT,TIFF,JPEG, MIDI,MPEG
第七层: 应用层 HTTP,FTP,SNMP 等
icmp 协议是 IP 层的附属协议, 是介于 IP 层和 TCP 层之间的协议, 一般认为属于 IP 层协议.
IP 协议用它来与其他主机或路由器交换错误报文和其他的一些网络情况.
在 ICMP 包重携带了控制信息和故障恢复信息.
主要用于路由器主机向其他路由器或者主机发送出错报文的控制信息
在 OSI 模型中 ARP 协议属于链路层; 而在 TCP/IP 模型中, ARP 协议属于网络层.
1)ARP 分层的位置是 TCP/IP 的网络层
2)ARP 报文是由以太网帧进行封装传输的. 没有封装进 IP 包.
3)实际上, 对网络接口层的以太网帧来讲, 它们同样是帧的上层协议, 当收到以太帧时, 根据帧的协议字段判断是送到 ARP 还是 IP.
4)之所以不把它放在数据链路层, 是因为它并不具备数据链路层的功能, 它的作用是为数据链路层提供接收方的帧地地址. TCP/IP 详解卷一里面有图, 明确它的位置属于网络层(注, 画的时候, ARP RARP 画在 IP 层稍下端, 而 ICMP 和 IGMP 画在 IP 层的上部, 因为这二个协议是由 IP 进行封装的.)
TCP/IP:
网络接口层(链路层):
网络层: IP,ICMP,IGMP,[ARP,RARP]
传输层: TCP ,UDP,UGP
应用层: Telnet,FTP,SMTP,SNMP.
OSI: 物理层: EIA/TIA-232, EIA/TIA-499, V.35, V.24, RJ45, Ethernet, 802.3, 802.5, FDDI, NRZI, NRZ, B8ZS
数据链路层: Frame Relay, HDLC, PPP, IEEE 802.3/802.2, FDDI, ATM, IEEE 802.5/802.2, [ARP,RARP]
网络层: IP,IPX,AppleTalk DDP
传输层: TCP,UDP,SPX
会话层: RPC,SQL,NFS,NetBIOS,names,AppleTalk,ASP,DECnet,SCP
表示层: TIFF,GIF,JPEG,PICT,ASCII,EBCDIC,encryption,MPEG,MIDI,html
应用层: FTP,WWW,Telnet,NFS,SMTP,Gateway,SNMP
RPC(Remote Procedure Call Protocol)-- 远程过程调用协议, 它是一种通过网络从远程计算机程序上请求服务, 而不需要了解底层网络技术的协议.
RPC 是基于 Socket 的, 即工作在会话层
RPC 协议假定某些传输协议的存在, 如 TCP 或 UDP, 为通信程序之间携带信息数据. 在 OSI 网络通信模型中, RPC 跨越了传输层和应用层. RPC 使得开发包括网络分布式多程序在内的应用程序更加容易.
RPC 采用客户机 / 服务器模式. 请求程序就是一个客户机, 而服务提供程序就是一个服务器. 首先, 客户机调用进程发送一个有进程参数的调用信息到服务进程, 然后等待应答信息. 在服务器端, 进程保持睡眠状态直到调用信息到达为止. 当一个调用信息到达, 服务器获得进程参数, 计算结果, 发送答复信息, 然后等待下一个调用信息, 最后, 客户端调用进程接收答复信息, 获得进程结果, 然后调用执行继续进行.
网络由下往上分为
物理层, 数据链路层, 网络层, 传输层, 会话层, 表示层和应用层.
通过初步的了解, 我知道 IP 协议对应于网络层, TCP 协议对应于传输层, 而 HTTP 协议对应于应用层,
三者从本质上来说没有可比性,
socket 则是对 TCP/IP 协议的封装和应用(程序员层面上), 是 api 层面的概念, 为方便开发而产生, 而不是通信协议层面里的概念.
也可以说, TPC/IP 协议是传输层协议, 主要解决数据如何在网络中传输,
而 HTTP 是应用层协议, 主要解决如何包装数据.
关于 TCP/IP 和 HTTP 协议的关系, 网络有一段比较容易理解的介绍:
" 我们在传输数据时, 可以只使用(传输层)TCP/IP 协议, 但是那样的话, 如果没有应用层, 便无法识别数据内容.
如果想要使传输的数据有意义, 则必须使用到应用层协议.
应用层协议有很多, 比如 HTTP,FTP,TELNET 等, 也可以自己定义应用层协议.
web 使用 HTTP 协议作应用层协议, 以封装 HTTP 文本信息, 然后使用 TCP/IP 做传输层协议将它发到网络上."
而我们平时说的最多的 socket 是什么呢, 实际上 socket 是对 TCP/IP 协议的封装, Socket 本身并不是协议, 而是一个调用接口(API).
通过 Socket, 我们才能使用 TCP/IP 协议.
实际上, Socket 跟 TCP/IP 协议没有必然的联系.
Socket 编程接口在设计的时候, 就希望也能适应其他的网络协议.
所以说, Socket 的出现只是使得程序员更方便地使用 TCP/IP 协议栈而已, 是对 TCP/IP 协议的抽象,
从而形成了我们知道的一些最基本的函数接口, 比如 create,listen,connect,accept,send,read 和 write 等等.
网络有一段关于 socket 和 TCP/IP 协议关系的说法比较容易理解:
"TCP/IP 只是一个协议栈, 就像操作系统的运行机制一样, 必须要具体实现, 同时还要提供对外的操作接口.
这个就像操作系统会提供标准的编程接口, 比如 win32 编程接口一样,
TCP/IP 也要提供可供程序员做网络开发所用的接口, 这就是 Socket 编程接口."
关于 TCP/IP 协议的相关只是, 用博大精深来讲我想也不为过, 单单查一下网上关于此类只是的资料和书籍文献的数量就知道.
CSDN 上有个比较形象的描述: HTTP 是轿车, 提供了封装或者显示数据的具体形式; Socket 是发动机, 提供了网络通信的能力.
实际上, 传输层的 TCP 是基于网络层的 IP 协议的, 而应用层的 HTTP 协议又是基于传输层的 TCP 协议的, 而 Socket 本身不算是协议, 就像上面所说, 它只是提供了一个针对 TCP 或者 UDP 编程的接口.
下面是一些经常在笔试或者面试中碰到的重要的概念, 特在此做摘抄和总结.
一, 什么是 TCP 连接的三次握手
第一次握手: 客户端发送 syn 包 (syn=j) 到服务器, 并进入 SYN_SEND 状态, 等待服务器确认;
第二次握手: 服务器收到 syn 包, 必须确认客户的 SYN(ack=j+1), 同时自己也发送一个 SYN 包(syn=k), 即 SYN+ACK 包, 此时服务器进入 SYN_RECV 状态;
第三次握手: 客户端收到服务器的 SYN+ACK 包, 向服务器发送确认包 ACK(ack=k+1), 此包发送完毕, 客户端和服务器进入 ESTABLISHED 状态, 完成三次握手.
握手过程中传送的包里不包含数据, 三次握手完毕后, 客户端与服务器才正式开始传送数据.
理想状态下, TCP 连接一旦建立, 在通信双方中的任何一方主动关闭连接之前, TCP 连接都将被一直保持下去.
断开连接时服务器和客户端均可以主动发起断开 TCP 连接的请求, 断开过程需要经过 "四次握手"(过程就不细写了, 就是服务器和客户端交互, 最终确定断开)
二, 利用 Socket 建立网络连接的步骤
建立 Socket 连接至少需要一对套接字, 其中一个运行于客户端, 称为 ClientSocket , 另一个运行于服务器端, 称为 ServerSocket .
套接字之间的连接过程分为三个步骤: 服务器监听, 客户端请求, 连接确认.
1, 服务器监听: 服务器端套接字并不定位具体的客户端套接字, 而是处于等待连接的状态, 实时监控网络状态, 等待客户端的连接请求.
2, 客户端请求: 指客户端的套接字提出连接请求, 要连接的目标是服务器端的套接字.
为此, 客户端的套接字必须首先描述它要连接的服务器的套接字, 指出服务器端套接字的地址和端口号, 然后就向服务器端套接字提出连接请求.
3, 连接确认: 当服务器端套接字监听到或者说接收到客户端套接字的连接请求时, 就响应客户端套接字的请求, 建立一个新的线程, 把服务器端套接字的描述发给客户端, 一旦客户端确认了此描述, 双方就正式建立连接.
而服务器端套接字继续处于监听状态, 继续接收其他客户端套接字的连接请求.
三, HTTP 链接的特点
HTTP 协议即超文本传送协议(Hypertext Transfer Protocol ), 是 Web 联网的基础, 也是手机联网常用的协议之一, HTTP 协议是建立在 TCP 协议之上的一种应用.
HTTP 连接最显著的特点是客户端发送的每次请求都需要服务器回送响应, 在请求结束后, 会主动释放连接. 从建立连接到关闭连接的过程称为 "一次连接".
四, TCP 和 UDP 的区别
1,TCP 是面向链接的, 虽然说网络的不安全不稳定特性决定了多少次握手都不能保证连接的可靠性 (参考 "两军问题"), 但 TCP 的三次握手在最低限度上(实际上也很大程度上保证了) 保证了连接的可靠性;
而 UDP 不是面向连接的, UDP 传送数据前并不与对方建立连接, 对接收到的数据也不发送确认信号, 发送端不知道数据是否会正确接收, 当然也不用重发, 所以说 UDP 是无连接的, 不可靠的一种数据传输协议.
2, 也正由于 1 所说的特点, 使得 UDP 的开销更小数据传输速率更高, 因为不必进行收发数据的确认, 所以 UDP 的实时性更好.
知道了 TCP 和 UDP 的区别, 就不难理解为何采用 TCP 传输协议的 MSN 比采用 UDP 的 QQ 传输文件慢了, 但并不能说 QQ 的通信是不安全的,
因为程序员可以手动对 UDP 的数据收发进行验证, 比如发送方对每个数据包进行编号然后由接收方进行验证啊什么的,
即使是这样, UDP 因为在底层协议的封装上没有采用类似 TCP 的 "三次握手" 而实现了 TCP 所无法达到的传输效率.
来源: http://www.bubuko.com/infodetail-2654338.html