当我们在谈论HTTP、TCP/IP、Socket时,我们在谈论什么?
网络协议层
网络七层协议
即,osi 7层模型,一般的教材都会给出,如下:
1 | graph TD |
网络七层协议由下往上分别为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。其中物理层、数据链路层和网络层通常被称作媒体层,是网络工程师所研究的对象;传输层、会话层、表示层和应用层则被称作主机层,是用户所面向和关心的内容。
++HTTP协议++对应于++应用层++,++TCP协议++对应于++传输层++,++IP协议++对应于++网络层++,HTTP协议是基于TCP连接的,三者本质上没有可比性。
TCP/IP是传输层协议,主要解决数据如何在网络中传输;而HTTP是应用层协议,主要解决如何包装数据。
Socket是应用层与TCP/IP协议族通信的++中间软件抽象层++,是它的一组接口。
1 | graph TD |
每个层级下有着多种协议支持,下面这个表是在网络上找到的,是一个早期的图,我觉得了解那么回事儿就可以了。
| 序号 | 层级 | 协议 |
|---|---|---|
| 7 | 应用层 | 例如HTTP、SMTP、SNMP、FTP、Telnet、SIP、SSH、NFS、RTSP、XMPP、Whois、ENRP |
| 6 | 表示层 | 例如XDR、ASN.1、SMB、AFP、NCP |
| 5 | 会话层 | 例如ASAP、TLS、SSH、ISO 8327 / CCITT X.225、RPC、NetBIOS、ASP、Winsock、BSD sockets |
| 4 | 传输层 | 例如TCP、UDP、RTP、SCTP、SPX、ATP、IL |
| 3 | 网络层 | 例如IP、ICMP、IGMP、IPX、BGP、OSPF、RIP、IGRP、EIGRP、ARP、RARP、 X.25 |
| 2 | 数据链路层 | 例如以太网、令牌环、HDLC、帧中继、ISDN、ATM、IEEE 802.11、FDDI、PPP |
| 1 | 物理层 | 例如线路、无线电、光纤、信鸽 |
TCP/IP五层模型
TCP/IP五层模型的协议分为:应用层、传输层、网络层、数据链路层和物理层。中继器、集线器、还有我们通常说的双绞线也工作在物理层;网桥(现已很少使用)、以太网交换机(二层交换机)、网卡(其实网卡是一半工作在物理层、一半工作在数据链路层)在数据链路层;路由器、三层交换机在网络层;传输层主要是四层交换机、也有工作在四层的路由器。

TCP/IP协议中的应用层处理七层模型中的第五层、第六层和第七层的功能。TCP/IP协议中的传输层并不能总是保证在传输层可靠地传输数据包,而七层模型可以做到。TCP/IP协议还提供一项名为UDP(用户数据报协议)的选择。UDP不能保证可靠的数据包传输。
- TCP:面向连接、传输可靠(保证数据正确性,保证数据顺序)、用于传输大量数据(流模式)、速度慢,建立连接需要开销较多(时间,系统资源)。
- UDP:面向非连接、传输不可靠、用于传输少量数据(数据包模式)、速度快。
TCP是一种流模式的协议,UDP是一种数据报模式的协议。
当我们谈论HTTP、TCP/IP、Socket时,我们在谈论什么
上面简单提到了以HTTP为代表的应用层,以TCP为代表传输层,以及以IP为代表的网络层的分工,那么,如果以一个WEB应用为例,这三种协议所代表的层级之间是如何协作分工的呢?换句话说,我在我的手机微信发的消息,经过了怎样的封装,途中经历了怎样的传输,就送到了另一部手机上显示出来的呢?这中间,Socket又是一个怎样的角色?它仅仅是一个概念吗?既然TCP和IP本是属于不同层级的两种协议,为何总是表达成TCP/IP这种组合的形式?
区分概念
- TCP/IP协议是传输层协议,主要解决数据如何在网络中传输;
- 而HTTP是应用层协议,主要解决如何包装数据
- Socket是API,主要实现了TCP协议,bind、listen、connect、accept、close都是这个API中提供的接口函数。
“协议”汉语上可以这样解释:
经过谈判、协商而制定的共同承认、共同遵守、经协商取得的一致意见
就比如,TCP协议就是一个规则,这个规则中,提出了三次握手(Client端提出连接请求的时候),四次握手(在有一方提出断开请求的时候)的等概念。通过这个规则,人们可以更准确更及时,尽可能“完美”地实现层到层的数据传输,完成传输层应该完成的任务。而经过多年的实践,这个规则人们用着挺舒服,也就有继续研究和使用的必要了,至于怎么去实现这些规则,类似Socket的种种API应运而生。
下面几个部分,我们先说TCP,再说Socket,最后说HTTP
TCP
要想明白Socket连接,先要明白TCP连接。手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上。
TCP协议基于在客户端Client与服务端Server的信息交互,TCP最重要的特点是建立Client与Server的连接时需要三次握手,有关三次握手,我真是不想看,不想看又不会【sad】
第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
三次握手(Three-way Handshake)即建立一个TCP连接时,需要客户端和服务器总共发送3个包。三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换TCP 窗口大小信息。在socket编程中,客户端执行connect()时,将触发三次握手。

握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”。

TCP连接的拆除需要发送四个包,因此称为四次握手(four-way handshake)。在socket编程中,任何一方执行close()操作即可产生握手(有地方称为“挥手”)操作。之所以有“三次握手”和“四次握手”的区别,是因为连接时当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
Socket
Http
综上,我们得出一下结论
- HTTP、TCP/IP是协议,Socket是API
- Socket不是协议,而是API,实现了TCP协议的API。
- HTTP协议将封装内容,TCP/IP负责在网络中运输HTTP封装的内容
这回,如果有人问你:“什么是socket?”,请不要只是说:“套接字”,这会然你直接进行不下去,因为你对套接字听得多,但实际上没有什么研究。在遇到这个问题,可以直接从“网络编程7层模型的传输层”说起,