TCP/IP、HTTP、Socket、WebSocket

非常通俗易通的文章介绍:

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协议规定的。

(4)http连接=以http协议为通信协议tcp连接

(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报文。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值