TCP/IP协议(二)
2014-09-04 11:03:27
注:关于seq 和 ack 的理解,seq为发送的字节的第一个序号,一直累加,ack接收字节的最后一个序号+1,建立连接和结束连接时的SYN、FIN标志位占一个序号
图1 8 - 1显示了这条命令产生T C P报文段的t c p d u m p输出。
序号用来标识从T C P发端向T C P收端发送的数据字节流,它表示在这个报文段中的的第一
个数据字节。如果将字节流看作在两个应用程序间的单向流动,则T C P用序号对每个字节进
行计数。序号是32 bit的无符号数,序号到达23 2-1后又从0开始。
当建立一个新的连接时, S Y N标志变1。序号字段包含由这个主机选择的该连接的初始序
号I S N(Initial Sequence Number)。该主机要发送数据的第一个字节序号为这个I S N加1,因为
S Y N标志消耗了一个序号(将在下章详细介绍如何建立和终止连接,届时我们将看到F I N标志
也要占用一个序号)。
既然每个传输的字节都被计数,确认序号包含发送确认的一端所期望收到的下一个序号。
因此,确认序号应当是上次已成功收到数据字节序号加1。只有A C K标志(下面介绍)为1时
确认序号字段才有效。
发送A C K无需任何代价,因为32 bit的确认序号字段和A C K标志一样,总是T C P首部的一
部分。因此,我们看到一旦一个连接建立起来,这个字段总是被设置, A C K标志也总是被设
置为1。

图1 9 - 2显示的是当我们键入5个字符d a t e \ n时的数据流(我们没有显示连接建立的过程,
并且去掉了所有的服务类型输出。B S D / 3 8 6通过设置一个R l o g i n连接的TO S来获得最小时延)。
第1行客户发送字符d到服务器。第2行是该字符的确认及回显(也就是图1 9 - 1的中间两部分数
据的合并)。第3行是回显字符的确认。与字符a有关的是第4 ~ 6行,与字符t有关的是第7 ~ 9行,
第1 0 ~ 1 2行与字符e有关。第3 ~ 4、6 ~ 7、9 ~ 1 0和1 2 ~ 1 3行之间半秒左右的时间差是键入两个字
符之间的时延。
注意到1 3 ~ 1 5行稍有不同。从客户发送到服务器的是一个字符(按下R E T U R N键后产生的
U N I X系统中的换行符),而回显的则是两个字符。这两个字符分别是回车和换行字符
(C R / L F),它们的作用是将光标回移到左边并移动到下一行。
第1 6行是来自服务器的d a t e命令的输出。这3 0个字节由2 8个字符与最后的C R / L F组成。紧
接着从服务器发往客户的7个字符(第1 8行)是在服务器主机上的客户提示符: svr4 % 。第1 9
行确认了这7个字符。
1.TCP连接的建立
- 三次握手建立连接时,发送方再次发送确认的必要性
- 主要是为了防止已失效的连接请求报文段突然又传到了B,因而产生错误。假定出现一种异常情况,即A发出的第一个连接请求报文段并没有丢失,而是在某些网络结点长时间滞留了,一直延迟到连接释放以后的某个时间才到达B,本来这是一个早已失效的报文段。但B收到此失效的连接请求报文段后,就误认为是A又发出一次新的连接请求,于是就向A发出确认报文段,同意建立连接。假定不采用三次握手,那么只要B发出确认,新的连接就建立了,这样一直等待A发来数据,B的许多资源就这样白白浪费了。
- 四次挥手释放连接时,等待2MSL的意义
- 第一,为了保证A发送的最有一个ACK报文段能够到达B。这个ACK报文段有可能丢失,因而使处在LAST-ACK状态的B收不到对已发送的FIN和ACK报文段的确认。B会超时重传这个FIN和ACK报文段,而A就能在2MSL时间内收到这个重传的ACK+FIN报文段。接着A重传一次确认。
- 第二,就是防止上面提到的已失效的连接请求报文段出现在本连接中,A在发送完最有一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。
4.TCP的有限状态机
|
状 态 |
描 述 |
|
CLOSED |
关闭状态,没有连接活动或正在进行 |
|
LISTEN |
监听状态,服务器正在等待连接进入 |
|
SYN RCVD |
收到一个连接请求,尚未确认 |
|
SYN SENT |
已经发出连接请求,等待确认 |
|
ESTABLISHED |
连接建立,正常数据传输状态 |
|
FIN WAIT 1 |
(主动关闭)已经发送关闭请求,等待确认 |
|
FIN WAIT 2 |
(主动关闭)收到对方关闭确认,等待对方关闭请求 |
|
TIMED WAIT |
完成双向关闭,等待所有分组死掉 |
|
CLOSING |
双方同时尝试关闭,等待对方确认 |
|
CLOSE WAIT |
(被动关闭)收到对方关闭请求,已经确认 |
|
LAST ACK |
(被动关闭)等待最后一个关闭确认,并等待所有分组死掉 |
TCP建立与释放的变迁如图所示:
- 客户进程变迁的过程(粗实线)
- 连接建立:设一个主机的客户进程发起连接请求(主动打开),这时本地TCP实体就创建传输控制快(TCB),发送一个SYN为1的报文,进入SYN_SENT状态。当收到来自进程的SYN和ACK时,TCP就发送出三次握手中的最后一个ACK,进而进入连接已经建立的状态ESTABLISHED。
- 连接释放:设运行客户进程主机本地TCP实体发送一个FIN置为1的报文,等待着确认ACK的到达,此时状态变为FIN_WAIT_1。当运行客户进程主机收到确认ACK时,则一个方向的连接已经关闭。状态变成FIN_WAIT_2。当运行客户进程的主机收到运行服务器进程的主机发送的FIN置为1的报文后,应响应确认ACK时,这是另一个连接关闭。但此时TCP还要等待一段时间后才删除原来建立的连接记录。返回到初始的CLOSED状态,这是为了保证原来连接上的所有分组都从网络中消失了。
- 服务器进程变迁的过程(粗虚线)
- 连接建立:服务器进程发出被动打开,进入监听状态LISTEN。当收到SYN置为1的连接请求报文后,发送确认ACK,并且报文中的SYN也置为1,然后进入SYN_RCVD状态。在收到三次握手最后一个确认ACK时,就转为ESTABLISHED状态。
- 连接释放:当客户进程的数据已经传送完毕。就发出FIN置为1的报文给服务器进程,进入CLOSE_WAIT状态。服务器进程发送FIN报文段给客户进程,状态变为LAST_ACK状态。当收到客户进程的ACK时,服务器进程就释放连接。删除连接记录。回到原来的CLOSED状态。
TCP/IP协议(二)的更多相关文章
- TCP/IP协议<二>
一.TCP/IP的标准化 1.TCP/IP的含义 一般来说,TCP/IP是利用IP进行通信时所必须用到的协议群的统称. 具体点,IP或ICMP.TCP或UDP.TELENT或FTP.以及HTTP等都属 ...
- 网络基础tcp/ip协议二
物理层解析: 物理层是TCP/IP模型的最低层,物理层为数据提供数据传输可靠通路. 物理层关心的介质: 信号 接口 传输介质 信号的分类:(信号是信息传递的媒介.) 模拟信号:连续变化的物理量 数字信 ...
- TCP/IP协议(二)tcp/ip基础知识
今天凌晨时候看书,突然想到一个问题:怎样做到持续学习?然后得出这样一个结论:放弃不必要的社交,控制欲望,克服懒惰... 然后又有了新的问题:学习效率时高时低,状态不好怎么解决?这也是我最近在思考的问题 ...
- 二:熟悉 TCP/IP 协议
一篇文章带你熟悉 TCP/IP 协议(网络协议篇二) 同样的,本文篇幅也比较长,先来一张思维导图,带大家过一遍. 一图看完本文 一. 计算机网络体系结构分层 计算机网络体系结构分层计算机网络体系结构分 ...
- 计算机网络通信TCP/IP协议浅析 网络发展简介(二)
本文对计算机网络通信的原理进行简单的介绍 首先从网络协议分层的概念进行介绍,然后对TCP.IP协议族进行了概念讲解,然后对操作系统关于通信抽象模型进行了简单介绍,最后简单描述了socket 分层的 ...
- TCP/IP知识总结(TCP/IP协议族读书笔记二)
接下来,总结一下网络层的协议,IP,ARP,RARP,ICMP,IGMP.当我们在网络传输的过程中,把分组交付到主机或路由器需要两级地址:物理地址和逻辑地址.而且我们需要能够把物理地址映射成为相应的逻 ...
- TCP/IP协议族之链路层(二)
TCP/IP学习记录,如有错误请指正,谢谢!!! TCP/IP协议族之链路层(二) 链路层是最底层协议,主要有三个目的: 1. 为IP模块发送和接收IP数据报 2. 为ARP模块发送ARP请求和接收A ...
- 003 TCP/IP协议详解(二)
一.ping ping可以说是ICMP的最著名的应用,是TCP/IP协议的一部分.利用"ping"命令可以检查网络是否连通,可以很好地帮助我们分析和判定网络故障. 例如:当我们某一 ...
- Linux 网络编程详解五(TCP/IP协议粘包解决方案二)
ssize_t recv(int s, void *buf, size_t len, int flags); --与read相比,只能用于网络套接字文件描述符 --当flags参数的值设置为MSG_P ...
- 网络基础二 tcp/ip协议簇 端口 三次握手 四次挥手 11种状态集
第1章 概念介绍 1.1 VLAN 1.1.1 什么是VLAN VLAN(Virtual LAN),翻译成中文是“虚拟局域网”.LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成 ...
随机推荐
- 您的服务器没有安装这个PHP扩展:OpenSSL(其他平台API同步需要)
今天在安装一个博客系统的时候提示这个错,在网上找了半天,自己慢慢弄出来的,具体如下: 1.找到你的php.ini 文件,将“;extension=php_openssl.dll”前面分号去掉. 2.复 ...
- PHPExcel创建文件格式写入对象实例
首先到http://www.codeplex.com/PHPExcel下载PHPExcel 下面就是php导出excel的程序 <?phpini_set("display_errors ...
- ffmpeg命令行
ubuntu下简单安装ffmpeg sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-nextsudo apt-get update sudo a ...
- IOS第16天(5,Quartz2D雪花)
*** #import "HMView.h" @interface HMView() { int count; } @property (nonatomic, assign) CG ...
- requirejs解决异步模块加载方案
他首先会遍历enableRegistry取出其中定义的模块,并且将没有加载成功的模块标识注入noLoads数组,如果过期了这里就会报错 如果上述没问题还会做循环依赖的判断,主要逻辑在breakCycl ...
- 上传下载后台函数以及前端脚本(webuploader) 备份
import java.io.BufferedOutputStream; import java.io.IOException; import java.io.InputStream; import ...
- iTunes.exe 在win7系统中运行出错解决办法
重新安装了iTunes打开后就报错,然后直接退出 查windows日志提示错误应用程序名称: iTunes.exe 错误模块名称: KERNELBASE.dll 重新安装iTunes问题依旧,后来在G ...
- lag 和 lead
TableA如下: TableA id name 1000 A 1001 B 1002 C 1003 D 1004 E 说明: lag 和lead 有三个参数,第一个参数是列名,第二个参数是偏移的of ...
- 《Linux内核分析》第三周 构建一个简单的Linux系统MenuOS
[刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK THREE ...
- ERROR 2006 (HY000) at line xx: MySQL server has gone away 解决方法