TCP/IP协议详解-TCP简介与TCP建立与终止
2015-08-25 23:01
561 查看
1 TCP简介
TCP是面向连接,可靠的字节流服务.Tcp对字节流的内容不作任何解释,它不知道二进制数据传输的是二进制数据,ASCII字符或其他类型数据。
TCP提供全双工服务,数据能在两个方向上独立的进行传输
TCP首部数据格式:
URG 紧急指针
ACK 确认序号有效
PSH 接收方应该尽快将这个报文段交给应用层
RST 重新连接
SYN 同步序列号用来发起一个连接
FIN 发送端完成发送任务
不同于IP检验和只包含首部,TCP检验和与UDP检验和相似,包含首部和数据
最常见的可选字段为最长报文大小(MSS)
2 TCP连接与终止
TCP连接与终止的tcpdump输出:
TCP连接与终止的时间序列:
建立连接协议(三次握手):
1)客户端发送一个SYN段指明客户打算连接的服务器端口,以及初始序号
2)服务器发挥包含服务器的初始序号的SYN报文段作为应答,同时,将确认序号设置为客户的ISN加1以对客户的SYN报文段进行确认。一个SYN将占用一个序号
3)客户必须将确认序号设置为服务器的ISN加1以对服务器的SYN报文段进行确认
连接终止协议(四次握手):
TCP是全双工,因此每个方向必须单独关闭。当TCP接连收到一个FIN只意味着这一方向上没有数据流动,进行半关闭状态,但依然可以发送数据。
3 连接建立超时
telnet服务器,然后断开服务器电缆时tcpdump输出:
可以看到SYN报文段进行了重传,当在设定的时间限制内依然无法成功建立连接,放弃连接
tos 0x10是IP数据报内的服务类型,tlenet将这个字段设置为最小时延
重传的时间存在一定规律。因为TCP软件采用500ms的定时器,并采用指数退避算法来确定每次重传时间
4 最大报文长度
tcpdump输出结果:
一个连接建立时,双方要通告各自的MSS,然后进行协商。如果一方不接受另一方通告的mss,就采用默认的mss(536字节)
sun收到的MSS选项值为256,发送的报文段不会超过256字节的数据。slip收到的MSS选项值为1460,但它的外出接口的MTU长度为296,为了避免分段,它不会发送超过256字节数据的报文段
5 TCP的半关闭
TCP是全双工,因此每个方向必须单独关闭。当TCP接连收到一个FIN只意味着这一方向上没有数据流动,进入半关闭状态,但依然可以发送数据。
6 TCP状态迁移
TIME_WAIT状态称为2MSL等待状态。MSL为一个报文段最大生存时间,该时间是有限的。因为TCP报文段以IP数据包在网络传输,IP数据包有限制其生存时间的TTL字段
当TCP执行一个注定关闭,并发回最后一个ACK,该来连接必须在TIME_WAIT状态停留的时间为2倍MSL,这样可以让TCP再次发送最后的ACK以防这个ACK丢失
同时需要注意的,一般情况,在TIME_WAIT状态下,对应的socket(客户IP地址和端口,服务器IP地址和端口)不能再被使用
处于TIME_WAIT的主机出现故障,会在MSL秒内重启,并使用原来的socket进行连接。这样的话,故障前发出的报文段会被错误的当作属于重启后新连接的报文段。因此规定TCP在重启后的MSL秒内不能建立任何连接
7 复位报文段
无论何时一个报文段发往连接出现错误,TCP都会发出一个复位报文段
到不存在的端口的连接请求:
tcpdump输出:
异常终止一个连接:
异常终止连接好处:
1)丢弃任何待发数据并立即发送复位报文段
2)RST的接收方会区分另一端执行的是异常关闭还是正常关闭
客户端:
tcpdump输出:
RST报文段不会导致另一端产生任何响应,另一端终止连接,通知应用层复位,不需要对RST报文发送ACK报文
服务端:
检测半打开连接:
服务器断开网络,重启,然重新连网来模拟半打开连接
tcpdump输出:
8 同时打开
A中的客户程序与B中的服务器程序建立连接,B中的客户程序与A中的服务器程序建立连接。客户程序选择的本地端口不是另一端服务器进程所熟悉的。这样设计就为了处理同时打开情况
例子:
主机A:
主机B:
tcpdump输出:
9 同时关闭
10 TCP选项
kind字段说明选项类型
len字段说明总长度
设置无操作选项的原因在于允许发送方填充字段为4字节的倍数
TCP是面向连接,可靠的字节流服务.Tcp对字节流的内容不作任何解释,它不知道二进制数据传输的是二进制数据,ASCII字符或其他类型数据。
TCP提供全双工服务,数据能在两个方向上独立的进行传输
TCP首部数据格式:
URG 紧急指针
ACK 确认序号有效
PSH 接收方应该尽快将这个报文段交给应用层
RST 重新连接
SYN 同步序列号用来发起一个连接
FIN 发送端完成发送任务
不同于IP检验和只包含首部,TCP检验和与UDP检验和相似,包含首部和数据
最常见的可选字段为最长报文大小(MSS)
2 TCP连接与终止
TCP连接与终止的tcpdump输出:
TCP连接与终止的时间序列:
建立连接协议(三次握手):
1)客户端发送一个SYN段指明客户打算连接的服务器端口,以及初始序号
2)服务器发挥包含服务器的初始序号的SYN报文段作为应答,同时,将确认序号设置为客户的ISN加1以对客户的SYN报文段进行确认。一个SYN将占用一个序号
3)客户必须将确认序号设置为服务器的ISN加1以对服务器的SYN报文段进行确认
连接终止协议(四次握手):
TCP是全双工,因此每个方向必须单独关闭。当TCP接连收到一个FIN只意味着这一方向上没有数据流动,进行半关闭状态,但依然可以发送数据。
3 连接建立超时
telnet服务器,然后断开服务器电缆时tcpdump输出:
可以看到SYN报文段进行了重传,当在设定的时间限制内依然无法成功建立连接,放弃连接
tos 0x10是IP数据报内的服务类型,tlenet将这个字段设置为最小时延
重传的时间存在一定规律。因为TCP软件采用500ms的定时器,并采用指数退避算法来确定每次重传时间
4 最大报文长度
tcpdump输出结果:
一个连接建立时,双方要通告各自的MSS,然后进行协商。如果一方不接受另一方通告的mss,就采用默认的mss(536字节)
sun收到的MSS选项值为256,发送的报文段不会超过256字节的数据。slip收到的MSS选项值为1460,但它的外出接口的MTU长度为296,为了避免分段,它不会发送超过256字节数据的报文段
5 TCP的半关闭
TCP是全双工,因此每个方向必须单独关闭。当TCP接连收到一个FIN只意味着这一方向上没有数据流动,进入半关闭状态,但依然可以发送数据。
6 TCP状态迁移
TIME_WAIT状态称为2MSL等待状态。MSL为一个报文段最大生存时间,该时间是有限的。因为TCP报文段以IP数据包在网络传输,IP数据包有限制其生存时间的TTL字段
当TCP执行一个注定关闭,并发回最后一个ACK,该来连接必须在TIME_WAIT状态停留的时间为2倍MSL,这样可以让TCP再次发送最后的ACK以防这个ACK丢失
同时需要注意的,一般情况,在TIME_WAIT状态下,对应的socket(客户IP地址和端口,服务器IP地址和端口)不能再被使用
处于TIME_WAIT的主机出现故障,会在MSL秒内重启,并使用原来的socket进行连接。这样的话,故障前发出的报文段会被错误的当作属于重启后新连接的报文段。因此规定TCP在重启后的MSL秒内不能建立任何连接
7 复位报文段
无论何时一个报文段发往连接出现错误,TCP都会发出一个复位报文段
到不存在的端口的连接请求:
tcpdump输出:
异常终止一个连接:
异常终止连接好处:
1)丢弃任何待发数据并立即发送复位报文段
2)RST的接收方会区分另一端执行的是异常关闭还是正常关闭
客户端:
tcpdump输出:
RST报文段不会导致另一端产生任何响应,另一端终止连接,通知应用层复位,不需要对RST报文发送ACK报文
服务端:
检测半打开连接:
服务器断开网络,重启,然重新连网来模拟半打开连接
tcpdump输出:
8 同时打开
A中的客户程序与B中的服务器程序建立连接,B中的客户程序与A中的服务器程序建立连接。客户程序选择的本地端口不是另一端服务器进程所熟悉的。这样设计就为了处理同时打开情况
例子:
主机A:
主机B:
tcpdump输出:
9 同时关闭
10 TCP选项
kind字段说明选项类型
len字段说明总长度
设置无操作选项的原因在于允许发送方填充字段为4字节的倍数
相关文章推荐
- TCP版backshell的VBS脚本代码
- TCP Wrappers防火墙介绍与封锁IP地址的方法
- c语言多进程tcp服务器示例
- win2003连接限制TCP连接限制
- PowerShell脚本开发之收发TCP消息包
- C#实现TCP连接信息统计的方法
- Android TCP 文件客户端与服务器DEMO介绍
- Android中实现TCP和UDP传输实例
- python实现可将字符转换成大写的tcp服务器实例
- php实现TCP端口检测的方法
- Java实现Socket的TCP传输实例
- 实现了基于TCP的Java Socket编程实例代码
- Java基于Tcp协议的socket编程实例
- python实现TCP服务器端与客户端的方法详解
- python检测远程服务器tcp端口的方法
- python实现简单的TCP代理服务器
- nginx搭建tcp代理服务器
- python网络编程之TCP通信实例和socketserver框架使用例子
- GO语言实现简单TCP服务的方法
- [源码分享]Erlang TCP 服务器代码