专栏首页东隅已逝3次握手+4次挥手+11种状态集

3次握手+4次挥手+11种状态集

TCP的介绍

TCP也叫传输控制协议(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。

TCP的特点

面向连接

✦ TCP通信需要经过创建连接数据传送终止连接三个步骤。

✦ 在通信开始之前,先建立相关的链接,才能发送数据,类似于生活中,"打电话"。

✦ 完成数据交换后,双方必须断开此连接,以释放系统资源。

✦ 这种连接是一对一的,因此TCP不适用于广播的应用程序,基于广播的应用程序请使用UDP协议。

可靠传输

✦ TCP发送的每个报文段都必须得到接收方的应答才认为这个TCP报文段传输成功

✦ 发送端发出一个报文段之后就启动定时器,如果在定时时间内没有收到应答就重新发送这个报文段。

✦ TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。

✦ TCP用一个校验和函数来检验数据是否有错误,在发送和接收时都要计算校验和。

TCP通信模型

TCP通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,类似于生活中,"打电话"

TCP客户端构建流程

比如一个人想打10086求助人工服务。 tcp的客户端要比服务器端简单很多,客户端只需要找一个电话亭,拿起电话拨打即可。

示例代码:

from socket import *

# 创建socket
tcp_client_socket = socket(AF_INET, SOCK_STREAM)

# 目的信息
server_ip = input("请输入服务器ip:")
server_port = int(input("请输入服务器port:"))

# 链接服务器
tcp_client_socket.connect((server_ip, server_port))

# 提示用户输入数据
send_data = input("请输入要发送的数据:")

tcp_client_socket.send(send_data.encode("gbk"))

# 接收对方发送过来的数据,最大接收1024个字节
recvData = tcp_client_socket.recv(1024)
print('接收到的数据为:', recvData.decode('gbk'))

# 关闭套接字
tcp_client_socket.close()

TCP服务端构建流程

在程序中,要完成一个tcp服务器的功能,需要的流程如下:

  1. socket创建一个套接字;
  2. bind绑定ip和port;
  3. listen使套接字变为可以被动套接字;
  4. accept取出一个客户端连接 用以服务;
  5. recv/send接收发送数据;

示例代码:

from socket import *

# 创建socket
tcp_server_socket = socket(AF_INET, SOCK_STREAM)

# 本地信息
address = ('', 7788)

# 绑定
tcp_server_socket.bind(address)

# 使用socket创建的套接字
tcp_server_socket.listen(128)

# 如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务
client_socket, clientAddr = tcp_server_socket.accept()

# 接收对方发送过来的数据
recv_data = client_socket.recv(1024)
print('接收到的数据为:', recv_data.decode('gbk'))

# 发送一些数据到客户端
client_socket.send("thank you !".encode('gbk'))

# 关闭为这个客户端服务的套接字
client_socket.close()

TCP的3次握手

SYN

请求建立连接字段:1表示与对方要进行网络连接建立 ,0 表示默认没有连接建立请求。

ACK

确认控制字段:1表示上一次发送的数据对方接收了,0 表示没有接收到上次发送的数据信息。

seq

随机序列号。

TCP的4次挥手

FIN

请求断开连接字段:1表示与对方断开网络连接,0 表示默认没有断开连接请求。

ack

随机序号回复(ack=seq+1)。

ctl

控制字段号。

TCP的11种状态集

TCP十一种状态转移总结

出现方式

出现环境

状态名称

状态描述

TCP建立过程

服务端/客户端

CLOSED

默认初始化状态

服务端

LISTEN

建立socket,进入监听状态

客户端

SYN_SENT

发送syn报文,进入syn发送状态

服务端

SYN_RCVD

接受syn报文,并回复ack及syn报文

服务端/客户端

ESTABLISHED

接受syn报文,回复ack建立连接(客户端)接受ack报文,建立连接(服务端)

TCP断开过程

服务端/客户端

ESTABLISHED

默认断开前初始化状态

客户端

FIN_WAIT1

发送断开请求FIN报文

服务端

CLOSE_WAIT

收到FIN后向客户端发送ACK

客户端

FIN_WAIT2

收到服务端返回的ACK报文,等待数据传输。

服务端

LAST_ACK

发送FIN断开请求报文

客户端

TIME_WAIT

回复FIN断开请求,发送ack报文

服务端/客户端

CLOSED

收到ack报文立即转换为断开状态,等待2MSL后,转变为断开状态

客户端

CLOSEING

没有收到回复FIN报文的ACK,直接收到FIN

tcp/ip协议簇

  • 为了把全世界的所有不同类型的计算机都连接起来,就必须规定一套全球通用的协议,为了实现互联网这个目标,互联网协议族(Internet Protocol Suite)就是通用协议标准。
  • 互联网协议包含了上百种,最重要的是TCP和IP协议,所以,互联网的协议简称TCP/IP协议(族)

TCP/IP协议簇之间的关系

TCP/IP协议传输示意图

本文分享自微信公众号 - 有暗香盈袖c(Born--To_Die),作者:Cool Wo

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 12-06【 Elasticsearch 中的 'jvm.options' 参数解析】

    除了更改堆大小之外,如果您对它不是非常深入的了解,请不要更改此文件中的任何其他参数,因为这些 JVM 的参数将会影响 Elasticsearch 的运行。。

    有暗香盈袖
  • 12-02【使用Auditbeat模块监控shell命令】

    Auditbeat Audited模块可以用来监控所有用户在系统上执行的 shell 命令。在终端用户偶尔才会登录的服务器上,通常需要进行监控。

    有暗香盈袖
  • Filebeat常见配置参数解释

    有暗香盈袖
  • 初学者第70节网络编程-Socket(一)

    java.net 包中 J2SE 的 API 包含有类和接口,它们提供低层次的通信细节。你可以直接使用这些类和接口,来专注于解决问题,而不用关注通信细节。

    用户5224393
  • BIO、NIO

    我们平常使用的IO是BIO(Blocking-IO),即阻塞IO、而NIO(No-blocking-IO)则是非阻塞IO,二者有什么区别呢?

    晚上没宵夜
  • Nodejs+socket.io搭建WebRTC信令服务器

    我们在学习 WebRTC 时,首先要把实验环境搭建好,这样我们就可以在上面做各种实验了。

    音视频_李超
  • 技术干货:从零开始,教你设计一个百万级的消息推送系统

    本文主要分享的是如何从零设计开发一个中大型推送系统,因限于篇幅,文中有些键技术只能一笔带过,建议有这方面兴趣的读者可以深入研究相关知识点,从而形成横向知识体系。

    JackJiang
  • 网红直播时的瘦脸、磨皮等美颜功能是如何实现的?

    随着移动设备的发展,美颜已成为多媒体内容生成链路中不可缺少的一种基本能力,尤其是在来疯直播秀场业务的场景下,主播的颜值就意味着生产力,直接影响主播及平台的收入。

    AI科技大本营
  • Android Wear 开发初探

    Android Wear从2014年3月发布到现在已经从1.0发展到2.0(目前还没正式发布)。其产品定位也发化了巨大变化,因为Android Wear 1.0...

    QQ音乐技术团队
  • 基于Jenkins打造符合DevOps能力成熟度三级标准的持续集成流水线

    DevOps的核心是自动化,自动化的核心是标准化。而DevOps最重要的一环节是持续交付,持续交付中建设的重点是流水线,所以如何打造标准的持续交付流水线则为De...

    JFrog杰蛙科技

扫码关注云+社区

领取腾讯云代金券