美文网首页
TCP和Socket基础

TCP和Socket基础

作者: ElliotG | 来源:发表于2020-05-27 20:31 被阅读0次

    0. TCP和Socket的定义

    什么是TCP?
    Transmission Control Protocol - 传输控制协议,是一种面向连接的,可靠的,基于字节流的传输层通信协议。
    这里需要记住的是:TCP是传输层的,它是一种通信协议。

    TCP和UDP一样,同属于OSI七层网络模型的第四层,即传输层。

    OSI网络模型:

    应用层 - 【HTTP, FTP, NFS ...】
    表示层 - 【Telnet,SNMP,Gopher】
    会话层 - 【SMTP,DNS】
    传输层 - 【TCP,UDP】
    网络层 - 【IP,ICMP,ARP ...】
    数据链路层 - 【Ethernet,ARPANET ...】
    物理层 - 【IEEE 802.1 - 802.11】

    什么是Socket?
    Socket即套接字。
    它是应用程序通过网络发送请求和接受应答的接口

     

    1. TCP的通信过程

    TCP的通信过程和打电话基本相同。
    一方负责接听某个特定号码的电话;另一方则需要拨通这个号码,即与对方建立通信连接。

    在这个过程中,

    听筒即Socket输入流,它负责接收对方的信息。

    话筒即Socket输出流,它负责向对方发送信息。

    整个通信的过程中,信息的接收和发送是同时进行的,即双工通信。

    TCP通信过程

     

    2. 建立连接的3次握手

    TCP建立连接需要3次握手。

    它和如下的打电话场景类似:
    A: 喂,你好,听得到吗?
    B: 喂, 你好,听得到。你听得到我说话吗?
    A: 嗯,听得到。

    TCP的3次握手过程如下:

    • 客户端先向服务端发送SYN包,Socket状态从CLOSED变为SYN-SEND。
    • 服务端接收到SYN包后,Socket状态从LISTEN变为SYN_RECV,同时向客户端发送SYN/ACK包来确认收到了刚才的SYN包。
    • 客户端收到了SYN/ACK包后,将Socket状态从SYN-SEND变为ESTABLISHED,再向服务端发送ACK包。
    • 服务端手动ACK包以后,Socket状态从SYN-RECV改为ESTABLISHED,连接建立成功,双方可以开始收发数据。

     

    3. 断开连接和优雅断开

    有建立连接必然就有断开连接。
    断开连接和建立连接一样非常重要,如果处理不当,不仅可能造成数据传输失败,还可能导致Socket不能关闭,资源无法释放等问题。

    优雅断开是指,一方在传输完成后,通知对方,自己的传输已经完成,不会再发起新的传输,但仍然接收对方发来的数据,直到对方也通知自己,传输已完成,不会再发送新的传输,这时候连接主动断开。

     

    4. 长连接与短连接

    什么是短连接?
    每次传输前建立连接,传输完成后关闭连接,这种方式被称为短连接。

    注:HTTP 1.x协议就是基于TCP短连接的超文本传输协议。

    什么是长连接?

    在客户端和服务端之间建立一个长期的连接,在其上进行多次通信,直到双方不再需要通信,或其中一方退出时才断开连接,这种方式称为长连接。

    注: FTP协议就是基于TCP长连接的文件传输协议。

    在客户端需要频繁地与服务端通信的场景下,我们需要使用长连接。

     

    5. 常见的实现长连接的机制

    使用Netty可以实现长连接。
    (注: 关于Netty请查看另外的单独专题)

    Netty创建长连接的基本步骤如下:

    1. 创建连接(Channel)

    2. 发心跳包

    3. 发消息,并通知其他用户

    4. 一段时间没收到心跳包或者用户主动关闭之后关闭连接

    相关文章

      网友评论

          本文标题:TCP和Socket基础

          本文链接:https://www.haomeiwen.com/subject/hvmgahtx.html