服务器编程入门(3)TCP协议详解
1 TCP服务的特点
先建立连接,才能开始读写数据双方都要分配内核资源全双工,读写可以通过一个连接
必须断开连接,以释放资源一对一,所以不适合基于广播和多播的应用程序(UDP适合)
- 发送应答机制,即发送端发送的每个TCP报文段都必须得到接收方的应答,才认为这个TCP报文段传输成功
- 超时重传机制:发送端在发送出一个TCP报文段之后启动定时器,如果在定时时间内未收到应答,它将重发该报文段
- 重排,整理:TCP报文段最终是以IP数据报发送的,而IP数据报到达接收端可能乱序、重复,所以TCP协议还会对接收到的TCP报文段重排、整理,再交付给应用层。


| 十六进制数 | 十进制表示 | TCP头部信息 |
| 0xa295 | 41621 | 源端口号 |
| 0x0017 | 23 | 目的端口号 |
| 0xd099e103 | 3499745539 | 序号 |
| 0x00000000 | 0 | 确认号 |
| 0xa | 10 | TCP头部长度为10个4字节,即40字节 |
| 0x002 | 设置了SYN标志位,即SYN=1 | |
| 0x8010 | 32792 | 接收窗口大小 |
| 0xfe30 | 头部检验和 | |
| 0x0000 | 没设置URG位,所以紧急指针无效 | |
| 0x0204 | 最大报文段长度选项的kind值和length值 | |
| 0x400c | 16396 | 最大报文长度 |
| 0x0402 | 允许SACK选项 | |
| 0x080a | 时间戳选项的kind值和length值 | |
| 0x026e44d9 | 40781017 | 时间戳 |
| 0x00000000 | 0 | 回显应答时间戳 |
| 0x01 | 空操作选项 | |
| 0x0303 | 窗口扩大因子选项的kind值和length值 | |
| 0x06 | 6 | 窗口扩大因子为6 |



- CLOSED是一个假想的起始点,并不是一个实际的状态。
- 粗虚线表示典型的服务器端连接的状态转移
- 粗实线表示典型的客户端连接的状态转移

- 可靠地终止TCP连接:若关闭确认报文段丢失(报文段7),则在这段时间等待接收重发的关闭确认报文段。
- 保证让迟来的TCP报文段有足够的时间被识别并丢弃:2MSL可确保在网络上两个传输方向上尚未被接收到的、迟到的TCP报文段都已经小时。确保一个新的TCP连接可以安全的建立而不会接收到上一个TCP连接的数据。(这也是为什么当有些和TCP相关的程序退出后,我们无法立即启动它的原因)
复位报文段:
- 访问不存在的端口:当客户端程序访问一个不存在的端口时,目标主机将给它发送一个复位报文段。
- 异常终止连接:一旦给对方发送一个复位报文段,发送端所有排队等待的数据都将被丢弃。
- 处理半打开连接:如果客户端(或服务器)处于半打开状态的连接写入数据,则对方将回应一个复位报文段。
- 交互数据(实时性):
- 成块数据(传输效率):
- 当传输大量大块数据的时候,发送方会连续发送多个TCP报文段,接收方可以一次确认所有这些报文段。
- 服务器每发送4个TCP报文段就传送一个PSH标志给客户端,以通知客户端的应用程序尽快读取数据。
- TCP模块为每个TCP报文段都维护一个重传定时器,该定时器在TCP报文段第一次被发送时启动。
- 如果超时时间内未收到接收方的应答,TCP模块将重传TCP报文段并重置定时器。
- 每次重传超时时间增加一倍。
- Linux内核有两个重要的内核参数与TCP超时重传相关:/proc/sys/net/ipv4/tcp_retries1和proc/sys/net/ipv4/tcp_retries2
- TCP报文段的重传可以发生在超时之前,即快速重传,下一节讨论。
- 慢启动(slow start)
- 拥塞控制(congestion avoidance)
- 快速重传(fast retransmit)
- 快速恢复(fast recovery)
多种实现:
- reno算法
- vegas算法
- cubic算法
最终受控制的变量:发送端向网络一次连续写入的数据量(SWND, 发送窗口)。

服务器编程入门(3)TCP协议详解的更多相关文章
- 第3章 TCP协议详解
第3章 TCP协议详解 3.1 TCP服务的特点 传输协议主要有两个:TCP协议和UDP协议,TCP协议相对于UDP协议的特点是 面向连接使用TCP协议通信的双方必须先建立连接,完成数据交换后,通信双 ...
- TCP协议详解7层和4层解析(美团,阿里) 尤其是三次握手,四次挥手 具体发送的报文和状态都要掌握
如果想了解HTTP的协议结构,原理,post,get的区别(阿里面试题目),请参考:HTTP协议 结构,get post 区别(阿里面试) 这里有个大白话的解说,可以参考:TCP/IP协议三次握手和四 ...
- TCP协议详解
TCP协议详解 一.TCP协议 1.TCP 通过以下方式提供可靠性: · ◆ 应用程序分割为TCP认为最合适发送的数据块.由TCP传递给IP的信息单位叫做报文段. · ◆ 当TCP发出一个报文段后 ...
- TCP协议详解(理论篇)
TCP协议详解(理论篇) 2012-08-20 0个评论 作者:陈立龙 收藏 我要投稿 TCP协议详解(理论篇) 1. 与UDP不同的是,TCP提供了一种面向连接 ...
- linux高性能服务器编程 (三) --TCP协议详解
第三章 IP协议详解 TCP协议是TCP/IP协议族中的另外一个重要的协议,与IP协议相比,TCP协议更高进应用层.一些重要的socket选项都和TCP协议相关.这一章主要从如下方面学习: 1)TCP ...
- Linux 高性能服务器编程——TCP协议详解
问题聚焦: 本节从如下四个方面讨论TCP协议: TCP头部信息:指定通信的源端端口号.目的端端口号.管理TCP连接,控制两个方向的数据流 TCP状态转移过程:TCP连接的任意一 ...
- 网络通信协议八之(传输层)TCP协议详解
传输层协议 分段是为了提高传输效率,封装是指给每个数据段添加一个编号 端到端的传输是逻辑上的端到端,并不是真正意义上的发送方某层与接收方某层之间的传输 IP协议只是保证数据报文发送到目的地,为主机之间 ...
- 【TCP协议详解】
为什么会有TCP/IP协议 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣经中上帝打乱了各地人的口音,让他们无法合作一样 ...
- TCP协议详解---上
TCP头格式 注意以下几点: TCP的包是没有IP地址的,那是IP层上的事.但是有源端口和目标端口. 一个TCP连接需要四个元组来表示是同一个连接(src_ip, src_port, dst_ip, ...
随机推荐
- Let’s do this!新手程序员的入门指南(转)
计算机科学(Computer Science)无疑是现在最热门的学科之一,这领域的工作薪水高.工作时间弹性,而且科技业对工程师.开发者的需求至今有增无减,科技龙头们随时虎视眈眈着出色的程式开发者.创意 ...
- 升级版:深入浅出Hadoop实战开发(云存储、MapReduce、HBase实战微博、Hive应用、Storm应用)
Hadoop是一个分布式系统基础架构,由Apache基金会开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力高速运算和存储.Hadoop实现了一个分布式文件系 ...
- for_each的各种情况下的使用详解
原创作者:http://oomusou.cnblogs.com 配合<C++ Template>(简体中文)使用 http://download.csdn.net/detail/qq239 ...
- DBA 应该要注意Linux 环境下的一些操作
DBA 对OS的依赖.一丁点儿也不亚于DB.对于Oracle DBA.尤为突出 DB和OS的感情也与日俱增.耦合度高的让人一度以为这两要劳燕双飞了 例如.Oracle里面. 而且.故障诊断以及 ...
- 十分钟开发一个调用Activity的PhoneGap插件
在HybridApp开发中,非常多业务我们是没有办法通过HTML5+js实现的,比方调用第三方的包括Activity的jar包,一些必须使用原生代码才干实现的功能,比方复杂的UI的效果,调用通讯相关的 ...
- web攻击方式和防御方法
在http请求报文中载入攻击代码,就能发起对web应用的攻击.通过url查询字段或者表单.http首部.cookie等途径吧攻击代码传入,若这时web应用存在安全漏洞,那内部信息就会遭到窃取! 对we ...
- Servlet的学习之Session(5)
在上一篇中我们介绍了如果使用Session来做一个简单的用户登录案例,在本篇中我们继续使用Session技术来做一个防止表单重复提交的案例. 这是一个很重要的知识点,在很多框架中都有防止表单重复提交的 ...
- HDU 3584 三维树状数组
三维树状数组模版.优化不动了. #include <set> #include <map> #include <stack> #include <cmath& ...
- mysql 执行计划走索引
<pre name="code" class="html">mysql> desc AssignClientManager; +------- ...
- java中完美打包
前言: 我们都知道Java可以将二进制程序打包成可执行jar文件,双击这个jar和双击exe效果是一样一样的,但感觉还是不同.其实将java程序打包成exe也需要这个可执行jar文件. 准备: ecl ...