当前位置: 首页 > 服务器&&网络编程 > 正文

Linux 网络编程 TCP协议学习

TCP学习要点:

1.TCP头部信息

2.TCP状态转移过程

3.TCP数据流,交互数据流,成块数据流,紧急数据流等

4.TCP数据流的控制,超时重传,拥塞控制

TCPhead

16位源端口号,告知主机该报文段来自哪里,后16位目的端口号,传递给上层应用程序或者应用程序。

32位序号,每次TCP通信过程中,某一个方向上的字节流的每一个字节编号,一般是一个数据报一个随机基本值加上偏移量。

32位确认号:用作对另一方发送来的TCP报文段的响应。其值就是接收到TCP报文段的序号值加一。

4位头部长度:标识该TCP头部有多少个32字,所以TCP最大头部长度是60字节

6位标志包含以下的一些项:

URG  紧急指针是否有效

ACK 表示确认号是否有效,我们称携带ACK标志的TCP报文段为确认报文段

PSH 标志,提示接收端应用程序应该立即从TCP接收区读取数据,为接收数据腾出空间。

RST 表示要求对方重新建立连接,称携带RST的TCP报文段为复位报文段。

SYN 表示请求建立一个连接,称携带SYN标志的TCP报文段为同步报文段。

FIN  表示通知对方本端要关闭连接了。我们称携带FIN标志的TCP报文段为结束段

16位窗口大小,是TCP流量控制的一个手段,这里说的窗口是接收通告窗口,他告诉对方本端的TCP还能接收容纳多少字节的数据,这样对方就能控制发送控制的速度了。

16位效验和由发送端填充,接收端用这个CRC来确定发送过程中是否有损坏

16位紧急指针,是一个正的偏移量,它和序号字段的值相加表示最后一个紧急数据的下一个序号。

最后的选项字段:

kind  (1B)             length(1B)               info(nB)

tcpdump 命令参数详解这里记录下

-A           以ASCII格式打印出所有分组,并将链路层的头最小化。
-c            在收到指定的数量的分组后,tcpdump就会停止。
-C           在将一个原始分组写入文件之前,检查文件当前的大小是否超过了参数file_size 中指定的大小。如果超过了指定大小,则关闭当前文件,然后在打开一个新的文件。参数 file_size 的单位是兆字节(是1,000,000字节,而不是1,048,576字节)。
-d            将匹配信息包的代码以人们能够理解的汇编格式给出。
-dd          将匹配信息包的代码以c语言程序段的格式给出。
-ddd        将匹配信息包的代码以十进制的形式给出。
-D           打印出系统中所有可以用tcpdump截包的网络接口。
-e            在输出行打印出数据链路层的头部信息。
-E           用spi@ipaddr algo:secret解密那些以addr作为地址,并且包含了安全参数索引值spi的IPsec ESP分组。
-f            将外部的Internet地址以数字的形式打印出来。
-F           从指定的文件中读取表达式,忽略命令行中给出的表达式。
-i            指定监听的网络接口。
-l            使标准输出变为缓冲行形式,可以把数据导出到文件。
-L          列出网络接口的已知数据链路。
-m         从文件module中导入SMI MIB模块定义。该参数可以被使用多次,以导入多个MIB模块。
-M         如果tcp报文中存在TCP-MD5选项,则需要用secret作为共享的验证码用于验证TCP-MD5选选项摘要(详情可参考RFC 2385)。
-b          在数据-链路层上选择协议,包括ip、arp、rarp、ipx都是这一层的。
-n          不把网络地址转换成名字。
-nn        不进行端口名称的转换。
-N         不输出主机名中的域名部分。例如,‘nic.ddn.mil‘只输出’nic‘。
-t          在输出的每一行不打印时间戳。
-O        不运行分组分组匹配(packet-matching)代码优化程序。
-P         不将网络接口设置成混杂模式。
-q         快速输出。只输出较少的协议信息。
-r          从指定的文件中读取包(这些包一般通过-w选项产生)。
-S         将tcp的序列号以绝对值形式输出,而不是相对值。
-s          从每个分组中读取最开始的snaplen个字节,而不是默认的68个字节。
-T         将监听到的包直接解释为指定的类型的报文,常见的类型有rpc远程过程调用)和snmp(简单网络管理协议;)。
-t           不在每一行中输出时间戳。
-tt         在每一行中输出非格式化的时间戳。
-ttt        输出本行和前面一行之间的时间差。
-tttt       在每一行中输出由date处理的默认格式的时间戳。
-u         输出未解码的NFS句柄。
-v         输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息。
-vv       输出详细的报文信息。
-w        直接将分组写入文件中,而不是不分析并打印出来。

TCP状态

TCP就是一个有线状态机,我个人认为TCP学习就是两个方面,说到底它也算是一种服务,TCP的东西很多,各个点都很重要,但是我觉得抓住以下两个方面就能基本解决问题:

1.TCP状态转移图,能自己画基本就理解了

2.TCP报头各个部分的作用,这个很重要

既然我这样觉得,那就按我自己的想法来吧。

o_tcpip状态迁移图

这个过程其实,还是挺清楚的,这里就不写具体过程了。以后没事看看,自己还能尝试回忆下。下面说说几个状态:

TIME_WAIT :

客户端连接在接收到服务器的结束报文段,并没有直接进入CLOSED状态,而是转移到TIME_WAIT 状态,这个时候这个端口需要等待2MSL的时间,才能完全关闭MSL,是TCP报文段在网络中最大生存时间,大约2MIN.

首先这个现象需要以下的一些条件:

1.首先这个问题常见于服务器,因为端口比较固定。

2.客户端一般是随机的端口,所以不容易发生这个问题。

3.必须是一个建立了一个连通的TCP,被异常终止才容易看到这个状态

复位报文段:

被接收一个RST,双方就开始断开连接了。

@访问不存在的端口

@异常终止连接

@处理半打开连接

TCP 交互数据:

交互数据:实时性高,比如telnet 这种

成块数据:通常为TCP报文段最大长度

快速恢复,快速重传,慢启动,拥塞避免:这几种算法,后边详细说,现在先放这里。

本文固定链接: http://zmrlinux.com/2016/03/15/linux-%e7%bd%91%e7%bb%9c%e7%bc%96%e7%a8%8b-tcp%e5%8d%8f%e8%ae%ae%e5%ad%a6%e4%b9%a0/ | Kernel & Me

该日志由 root 于2016年03月15日发表在 服务器&&网络编程 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: Linux 网络编程 TCP协议学习 | Kernel & Me