TCP协议

协议格式

0 16 31

|16位源端口 | 16位目标端口|

| 32位序号 |

| 32位确认序号 |

|4位首部长度|保留(6位)|URG|ACK|PSH|RST|SYN|FIN|16位窗口大小|

|16位校验和| 16位紧急指针|

|选项|

|数据|

解析:

16位窗口大小用于流量控制。

16位校验和:将协议头和数据都计算在内。

16位紧急指针:紧急数据在数据包中偏移,紧急数据一般放在包尾。

4位首部长度:以4字节为单位,最长60字节,最短20字节。

URG:紧急数据,一般置0。

ACK:1包含应答信息,0不包含应答信息。

PSH:1包内含数据,0此包为空包。

RST:1进程结束或无此进程,一般置0.

SYN:1建立链接,一般置0.

FIN:1关闭连接,一般置0.

在数据传输过程中,ACK和确认序号非常重要。应用程序交给TCP协议发送的数据会暂存在TCP层的发送缓冲器中,发送给对方数据后,只有收到对方应答的ACK段才知道该数据发到了对方,可以从发送缓冲区中释放掉了。如果因为网络故障丢失了数据包或者丢失了对方发回的ACK段,经过等待超时后TCP协议自动将发送的缓冲区中的数据包重发。

连接建立与关闭

三次握手:A-> SYN -> B

    A<- SYN|ACK <- B

    A-> ACK -> B

过程:服务器调用socket,bind,listen完成初始化后,调用accept()阻塞等待,处于监听端口的状态。客户端调用socket初始化后,调用connect发送SYN段并且阻塞等待服务器应答,服务器应答一个SYN-ACK段,客户端收到后从connect()返回,同时应答一个ACK段,服务器收到后从accept()返回。

关闭: A-> FIN -> B

  A<- ACK <- B

  ...

  A<- FIN <- B

  A-> ACK -> B

如果客户端没有更多的请求了,就调用close()关闭连接,就像写端关闭管道一样,服务器的read()返回0(收到FIN段),这样服务器就知道客户端关闭连接了(回复ACK,处理完自身事情后),也调用close()关闭连接。

注意:任何一方调用close()后,连接的两个传输方向都关闭,不能再发送数据了。如果一方调用shutdown()则链接处于半关闭状态,仍可接收对方发来的数据。

注:1. 回执包含在发送包中,节省网络传输时间。

2. 每次连接的首个数据包的起始序号应该比该端口的上次序号(结束连接)大。以此辨认上次错误回复包。

3. SYN位和FIN位也要占用一个序号。

4. 主动关闭连接方处于Time-wait状态。

5. 每发送一个字节,序号加1;发送10字节,序号要增加10。

RST示例:

在TCP通讯中,如果一方收到另一方发来的段,读出其中的端口号,发现本机并没有任何进程使用这个端口,就会应答一个RST位的段给另一方。例如,服务器并没有进程使用8080端口,客户端telnet连接它,服务器收到客户端发来的SYN段就会应答一个RST段,客户端收到RST段后报告错误:Connection refused。

TCP协议格式的更多相关文章

  1. 网络编程杂谈之TCP协议

    TCP协议属于网络分层中的传输层,传输层作用的就是建立端口与端口的通信,而其下一层网络层的主要作用是建立"主机到主机"的通信,所以在我们日常进行网络编程时只要确定主机和端口,就能实 ...

  2. TCP协议调试工具TcpEngine V1.3.0使用教程

    简介   这里说的TCP协议调试定义是在开发长连接TCP协议应用时,为了验证代码流程或查找bug,需要与对端交互数据过来,当需要时可以暂停发送:单条发送:跳过发送:正常发送:发送时修改数据等.   T ...

  3. [转帖]IP /TCP协议及握手过程和数据包格式中级详解

    IP /TCP协议及握手过程和数据包格式中级详解 https://www.toutiao.com/a6665292902458982926/ 写的挺好的 其实 一直没闹明白 网络好 广播地址 还有 网 ...

  4. IP封包协议头/TCP协议头/TCP3次握手/TCP4次挥手/UDP协议头/ICMP协议头/HTTP协议(请求报文和响应报文)/IP地址/子网掩码(划分子网)/路由概念/MAC封包格式

    IP协议头IP包头格式: 1.版本号:4个bit,用来标识IP版本号.这个4位字段的值设置为二进制的0100表示IPv4,设置为0110表示IPv6.目前使用的IP协议版本号是4. 2.首部长度:4个 ...

  5. 结合Wireshark捕获分组深入理解TCP/IP协议栈之TCP协议(TCP报文格式+三次握手实例)

    摘要:     本文简单介绍了TCP面向连接理论知识,详细讲述了TCP报文各个字段含义,并从Wireshark俘获分组中选取TCP连接建立相关报文段进行分析. 一.概述     TCP是面向连接的可靠 ...

  6. 简析TCP的三次握手与四次分手(TCP协议头部的格式,数据从应用层发下来,会在每一层都会加上头部信息,进行封装,然后再发送到数据接收端)good

    2014-10-30 分类:理论基础 / 网络开发 阅读(4127) 评论(29)  TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇文章时,我想你也知道TCP的概念了,想要更 ...

  7. TCP协议探究(一):报文格式与连接建立终止

    一 TCP:传输控制协议报文格式 1 TCP服务 提供面向连接.可靠的字节流服务 面向连接意味着两方通信,不支持多播和广播 可靠性的支持: 应用数据被分割成TCP认为最适合发送的数据块.由TCP传递给 ...

  8. 计算机网络传输层之TCP协议(tcp协议特点、tcp报文段首部格式、tcp连接建立---三次握手、tcp连接释放---四次握手)

    文章转自:https://blog.csdn.net/weixin_43914604/article/details/105516090 学习课程:<2019王道考研计算机网络> 学习目的 ...

  9. 【转】TCP协议

    TCP是什么? TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的.可靠的. 基于IP的传输层协议.TCP在IP报文的协议号是6.TCP是一 ...

随机推荐

  1. IOS客户端Coding项目记录(一)

    1:UITextField设置出现清除按键 self.textField.clearButtonMode = UITextFieldViewModeWhileEditing; 说明: UITextFi ...

  2. CodeForces 2A - Winner(模拟)

    题目链接:http://codeforces.com/problemset/problem/2/A A. Winner time limit per test 1 second memory limi ...

  3. 百度地图API拾取坐标网址

    http://api.map.baidu.com/lbsapi/getpoint/index.html

  4. 【TP3.2】路由匹配和规则

    TP3.2框架的路由匹配和规则处理: 包括:静态路由,动态路由,多参数路由.正则路由 <?php return array( //'配置项'=>'配置值' /* * 路由开启和匹配.首先开 ...

  5. C#:TextBox控件操作类

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...

  6. Linux下 sleep函数的注意事项

    1. 休眠sleep(unsigned int)为线程内操作  所以如果不同线程,信号量SIGALRM是不能中断sleep():  编写程序进行测试 //timercreate_demo.cpp #i ...

  7. HDU 4280Island Transport(网络流之最大流)

    题目地址:pid=4280">http://acm.hdu.edu.cn/showproblem.php? pid=4280 这个题是一个纯最大流模板题..就是用来卡时间的.. 还好我 ...

  8. C# ManualResetEvent

    文章转载自:C# ManualResetEvent ManualResetEvent被用于在两个或多个线程间进行线程信号发送. 多个线程可以通过调用ManualResetEvent对象的WaitOne ...

  9. linux 查看CPU、内存大小

    查看linux下的cpu.内存和硬盘大小: 查看cpu的方法 1. cat /proc/cpuinfo  或者 更直观的查看cpu的型号命令:dmesg |grep -i xeon 查看内存的方法 2 ...

  10. LIntcode---将二叉搜索树转成较大的树

    Given a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original B ...