TCP协议

一、说明

在目前通信当中,网络服务通信随处可见,TELNET, SSH,HTTP, SMTP, POP, SSL/TLS, FTP等应用层的通行协议,而在这些上层的通信方式中,是tcp, udp, sctp等下层的基本通信协议作为支撑。本人之前做到一个https通信的项目,就顺便找了一下相关资料作为记录。本人新手,很多资料都是在网络上各位大佬的博客中汲取的,用自己可以理解的方式选择性吸收,尽量附上资料来源,不过有些忘记来源的也没办法了。

二、资料来源

百度百科:TCP(传输控制协议)
rugu_xxx博客:TCP 详解
割肉机博客:TCP和UDP的最完整的区别

三、协议介绍

在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。
TCP提供一种面向连接的、可靠的字节流服务。面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据包之前必须先建立一个TCP连接。这一过程与打电话很相似,先拨号振铃,等待对方摘机说“喂”,然后才说明是谁。
在一个TCP连接中,仅有两方进行彼此通信。广播和多播不能用于TCP
应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报文段。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。
每台支持TCP的机器都有一个TCP传输实体。TCP实体可以是一个库过程、一个用户进程,或者内核的一部分。在所有这些情形下,它管理TCP流,以及与IP层之间的接口。TCP传输实体接受本地进程的用户数据流,将它们分割成不超过64KB(实际上去掉IP和TCP头,通常不超过1460数据字节)的分段,每个分段以单独的IP数据报形式发送。当包含TCP数据的数据报到达一台机器时,它们被递交给TCP传输实体,TCP传输实体重构出原始的字节流。为简化起见,我们有时候仅仅用“TCP”来代表TCP传输实体(一段软件)或者TCP协议(一组规则)。
IP层并不保证数据报一定被正确地递交到接收方,也不指示数据报的发送速度有多快。,TCP必须提供可靠性的良好性能,这正是大多数用户所期望的而IP又没有提供的功能。

四、连接方式

1、建立连接

tcp握手方式
TCP三次握手的过程如下:

  1. 客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。
  2. 服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。
  3. 客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。
    三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。

2、断开连接

建立一个连接需要三次握手,而终止一个连接要经过四次握手,这是由TCP的半关闭(half-close)造成的。具体过程如下图所示。
tcp挥手方式
1) 某个应用进程首先调用close,称该端执行“主动关闭”(active close)。该端的TCP于是发送一个FIN分节,表示数据发送完毕。
(2) 接收到这个FIN的对端执行 “被动关闭”(passive close),这个FIN由TCP确认。
注意:FIN的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程,放在已排队等候该应用进程接收的任何其他数据之后,因为,FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。
(3) 一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN。
(4) 接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FIN。 [3]
既然每个方向都需要一个FIN和一个ACK,因此通常需要4个分节。

五、数据包解析

数据包解析
我们来分析分析每部分的含义和作用

  • 源端口号/目的端口号: 表示数据从哪个进程来, 到哪个进程去.
  • 32位序号:
  • 4位首部长度:表示该tcp报头有多少个4字节(32个bit)
  • 6位保留: 顾名思义, 先保留着, 以防万一
  • URG: 标识紧急指针是否有效
  • ACK:标识确认序号是否有效
  • PSH: 用来提示接收端应用程序立刻将数据从tcp缓冲区读走
  • RST: 要求重新建立连接.我们把含有RST标识的报文称为复位报文段
  • SYN: 请求建立连接. 我们把含有SYN标识的报文称为同步报文段
  • FIN: 通知对端,本端即将关闭. 我们把含有FIN标识的报文称为结束报文段
  • 16位窗口大小:
  • 16位检验和: 由发送端填充, 检验形式有CRC校验等.如果接收端校验不通过, 则认为数据有问题. 此处的校验和不光包含TCP首部, 也包含TCP数据部分.
  • 16位紧急指针:用来标识哪部分数据是紧急数据. 选项和数据暂时忽略

六、编程步骤

TCP编程的服务器端一般步骤是:
  1、创建一个socket,用函数socket();
  2、设置socket属性,用函数setsockopt(); * 可选
  3、绑定IP地址、端口等信息到socket上,用函数bind();
  4、开启监听,用函数listen();
  5、接收客户端上来的连接,用函数accept();
  6、收发数据,用函数send()和recv(),或者read()和write();
  7、关闭网络连接;
  8、关闭监听;

TCP编程的客户端一般步骤是:
  1、创建一个socket,用函数socket();
  2、设置socket属性,用函数setsockopt();* 可选
  3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
  4、设置要连接的对方的IP地址和端口等属性;
  5、连接服务器,用函数connect();
  6、收发数据,用函数send()和recv(),或者read()和write();
  7、关闭网络连接;

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值