非常通俗易通的文章介绍:
TCP/IP、Http、Socket的区别? - 知乎 这个问题里:热爱生活的小胖胖 和 渣硕 的回复!!!
简单记录下自己学习笔记:
(1)网络通信有7大层:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层;
(2)IP协议是网络层协议, TCP\UDP协议是传输层协议,http协议、websocket协议是应用层协议;
(3)TCP\UDP协议告诉了A与B可以通信,http协议、websocket协议规定了A与B通信的规则。
比如媒婆给了两个年轻人A、B各自的联系方式,这样A与B就可以自己交流。但是A与B要怎么交流 才能有效的了解对方,达到心灵相惜,对方说啥 另一方都可以听懂而不是对牛弹琴?这个过程媒婆就无法参与了,需要A与B构建自己的交流方式。
那“媒婆”就充当了TCP\UDP协议的角色,具体的“怎么有效沟通?”就是http协议或websocket协议规定的。
(5)socket是tcp协议暴露出的一个接口。
可以说tcp协议是一纸文书,但要把这个文字的东西转成计算机看的懂的东西,就需要用代码实现这份协议。socket就是这部分代码暴露出的一个接口。tcp协议暴露出的还有很多其他接口,如bind、listen、accept、connect等,供开发者们自行调用。也就是说开发者调用这些接口,就是在调tcp协议。
(6)tcp连接本身无长、短之分。看使用方法是每次数据包传输完就断开连接,还是传输完还保持连接心跳,来区分是短连接 or 长连接。
(7)websocket和http一样,也是应用层协议。两者的区别,详见:用了这么久,WebSocket和Socket的区别,你真的知道吗?
对“websocket是双向、http是单向”的解释:“单向”是指只能由客户端发起请求,由服务端响应请求;“双向”是指无论是客户端or服务端都可以既是请求发起方、又是请求响应方。
WebSocket应用举例:在线聊天,当A发送一条信息给B,服务器会立即将这条信息推送给B,而B的设备无需发送请求来获取这条信息。这就需要服务器能主动向客户端(A、B)推送信息,而这一点是HTTP协议无法做到的,但WebSocket协议可以。
1、TCP状态介绍
- 主动连接端可能的状态有:
CLOSED SYN_SEND ESTABLISHED。
- 主动关闭端可能的状态有:
FIN_WAIT_1 FIN_WAIT_2 TIME_WAIT。
- 被动连接端可能的状态有:
LISTEN SYN_RECV ESTABLISHED。
- 被动关闭端可能的状态有:
CLOSE_WAIT LAST_ACK CLOSED。
各个状态的意义如下:
LISTEN - 监听客户端TCP端口的连接请求;
SYN-SENT -客户端发送连接请求后进入这个状态;
SYN-RECEIVED- 服务端在收到客户端连接请求后,发送对连接请求的确认,进入此状态;
ESTABLISHED- 客户端接收到服务端的确认信息,发送对服务端的确认回复,双方进入此状态,代表双方建立连接,数据可以互相传送了;
FIN-WAIT-1 -主动方(可以是服务机,也可以是客户机)发出连接中断请求,进入此状态,告诉被动方,之后自己将不再发送消息了;
FIN-WAIT-2 - 主动方接收到被动方发来的同意关闭输出流的信息,进入此状态;
CLOSE-WAIT - 被动方发送同意关闭输出流的信息后,进入此状态(此时相当于半关闭状态,也就是主动方不会发消息了,但被动方还可以继续接收和发送消息),等待处理自身未发送完和未接收完的信息;然后被动方发出中断连接的请求(此时即被动方也要中断接收和发送消息了);
LAST-ACK - 被动方等待主动方同意被动方关闭输出流;
TIME-WAIT -主动方收到被动方发送的关闭连接的请求,进入此状态,并发送同意被动方关闭连接的确认信息;
CLOSING -等待远程TCP对连接中断的确认;
CLOSED - 双方连接已中断;
图1:三次握手
图2:四次挥手
2、TCP连接为什么进行三次握手,而关闭需要进行四次挥手?
这是为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
在谢希仁著《计算机网络》第四版中讲“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”。在另一部经典的《计算机网络》一书中讲“三次握手”的目的是为了解决“网络中存在延迟的重复分组”的问题。这两种不用的表述其实阐明的是同一个问题。
谢希仁版《计算机网络》中的例子是这样的,“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。”。主要目的防止server端一直等待,浪费资源。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你未必马上关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文 和FIN报文多数情况下都是分开发送的。
3、 为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状 态?
这是因为双方虽然都同意关闭连接了,并且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态;但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报 文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报 文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。