网络由下往上分为
物理层, 数据链路层, 网络层, 传输层, 会话层, 表示层和应用层.
通过初步的了解, 我知道 IP 协议对应于网络层, TCP 协议对应于传输层, 而 HTTP 协议对应于应用层,
三者从本质上来说没有可比性,
socket 则是对 TCP/IP 协议的封装和应用(程序员层面上).
也可以说, 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 协议的相关只是, 用博大精深来讲我想也不为过, 单单查一下网上关于此类只是的资料和书籍文献的数量就知道,
这个我打算会买一些经典的书籍 (比如TCP/IP 详解: 卷一, 卷二, 卷三) 进行学习, 今天就先总结一些基于基于 TCP/IP 协议的应用和编程接口的知识, 也就是刚才说了很多的 HTTP 和 Socket.
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-2656280.html