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. 那些年困扰我们的Linux 的蠕虫、病毒和木马

    虽然针对Linux的恶意软件并不像针对Windows乃至OS X那样普遍,但是近些年来,Linux面临的安全威胁却变得越来越多.越来越严重.个中原因包括,手机爆炸性的普及意味着基于Linux的安卓成为 ...

  2. Permission 0644 for .ssh/id_rsa Are Too Open 解决办法

    Permission 0644 for .ssh/id_rsa Are Too Open 解决办法 学习了:https://blog.csdn.net/muyimo/article/details/7 ...

  3. 关于angularjs中路由页面强制更新的问题

    有这么一个问题,在页面内路由页面跳转时,第一次跳入路由页面时是正常的,但是第二次会记住第一次时的状态,有时候并不想这样,想强制更新这个路由页面. 有一种方式就是使用 ui-sref-opts功能,我试 ...

  4. STL - vector algorithm

    // create vector with elements from 1 to 6 in arbitrary order vector<, , , , , }; // find and pri ...

  5. 微信小程序 - 贝塞尔曲线(购物车效果)

    转载来源于:https://segmentfault.com/a/1190000011710786 简化了一下,发出来吧 示例源码:点击下载

  6. Linux dig

    安装dig: yum install bind-utils dig 常用命令: # dig 最基本的用法dig @server sina.com.cn. # 用 dig 查看 zone 数据传输 di ...

  7. alarm 和 sleep

    http://blog.sina.com.cn/s/blog_6a1837e90100uhl3.html alarm也称为闹钟函数,alarm()用来设置信号SIGALRM在经过参数seconds指定 ...

  8. 【Linux】more命令

    用途 more主要用于一页一页查看档案 全称 全称即为more 说明 空格键 :代表向下翻一页,也可以使用CTRL+F Enter :代表下翻一行 :f      :立刻显示出文件名以及目前显示的行数 ...

  9. CentOS 6上的redis搭建实战记录(转)

    redis 是一个基于内存的高性能key-value数据库,数据都保存在内存中定期刷新到磁盘,以极高的读写效率而备受关注.他的特点是支持各种数据结构,stirng,hashes, list,set,和 ...

  10. STS(Spring Tool Suite)设置支持maven