TCP/IP 协议简单分析
首先TCP和IP是两种不同的协议,它们来七层网络模型中分别在不同的层次,IP协议是网络层的协议,TCP是更高一层的传输层的协议,TCP是建立在IP协议之上的,所以一般把TCP和IP连在一起说TCP/IP协议。
Windows系统的TCP协议栈的数据包默认是1460字节大小,如果一次传输的数据大于这个长度,会把分割成几个长度都不大于1460字节的TCP数据包,每个数据包都会被赋予一个sequnce number(相当于每个数据包的顺序号,凭这个接收端可以知道数据包的前后顺序)
之后TCP的数据包再被包裹上一层IP的数据的头,形成IP数据包在网上传输(其实最后还要包一层以太网数据包,网络上最终传输的都是以太网数据包)。
IP数据包到了目的地后,接收端首先把IP数据包的包头去掉,取出TCP的包。接收端每收到一个TCP的数据包都需要返回给发送端一个ACK的数据包告诉发送端已接到此数据包,如果接收端在一定的时间内没有收到某个数据包的ACK响应,会再次发送这个数据包,这样就保证了数据都能被接收端接收到(因特网上丢数据包是很正常的事,如果没有数据包重发机制,很难保证发送的数据都能被接收端完整的收到)。
每个TCP数据包也是由包头和实际数据组成,包头包含如下主要内容:
l Source port(2字节)
发送端的端口号
l Destination port(2字节)
接收端的端口号
TCP包头中只包含双方的端口号,双方的IP地址在IP包的包头,所以在TCP数据包的包头中没有IP地址。
l Sequence number(4字节)
数据的顺序号,表示当前数据包中的数据起始顺序号,比如前一个数据包的SEQ为十六进制的:df d5 aa 3d ,数据包的实际数据长度为16字节,那么下一个数据包的SEQ就要在前一个数据包的SEQ基础上加上16,为:df d5 aa 4d
l Acknowledgement number(4字节)
接收到对方的某个数据包后的回应顺序号。如果接收到了对方主动发送来的某个数据包,必须要返回对方一个ACK回应数据包,数据包的头部的Acknowledgement number部分根据对方发送数据的SEQ和实际数据长度,返回SEQ + 实际数据长度,表示已经接收到这个数据包。对方收到这个回应,根据数值计算后知道这个数据包已经被对方接收。如果接收不到ACK的回应,就意味着这个数据包已经在网上被丢失,需要重新发送此数据包。
l Header length(1字节)
表示TCP数据包的包头长度,整个TCP数据包的长度减包头长度就能得到TCP数据包的实际传送的数据长度。
l Flags(1字节)
标志字节,每一位都是一个标志,以下是几个主要标志:
ACK – 表示数据包是个ACK回应数据包,表示接收到了对方的某个数据包,具体哪个包由包头的Acknowledgement number部分指示。
PSH – 表示这是个有实际数据的包。
SYN – 表示这是个建立连接的数据包,通讯双方要通讯,总是由客户端先发送SYN数据包到服务端以建立TCP的连接。
FIN – 表示通讯结束,拆除连接的数据包。
下面描述一次TCP传送数据的完整过程,以一个客户端向服务端发送一些数据为例。

Figure 1.一次完整的TCP通讯的过程
1、 建立连接
TCP是面向连接的协议,客户端和服务端要通讯就必须先建立一个连接。首先通讯双方都有地址,就是IP地址加端口号(IP:Port)标识通讯的每一端,客户端的IP:Port跟服务器IP:Port之间就构成一个socket套接字。所谓建立连接就是在客户端的IP:Port跟服务器IP:Port之间建立一个通道,初始化一些通讯的基础设置,以便以后的数据通讯的正常进行。
1.1. 客户端发送SYN
总是客户端发起连接,首先客户端发送SYN数据包到服务端以建立TCP连接。
SYN数据包只有TCP包头,没有实际数据。
Flags标志字节的SYN位置位,表示是SYN数据包。
Sequence number由客户端随机生成一个4字节的数据,作为本次连接通讯客户端数据的起始顺序号,以后客户端发往服务端的数据包的Sequence number都在此基础上加上每次传送的实际数据长度依次相加递增,这样根据每个数据包的Sequence number就能判断出数据包的前后顺序,以便接收方根据数据包的顺序拼接数据包。
1.2. 服务端回应ACK、SYN
服务端收到客户端的SYN后,首先要发送一个ACK数据包给客户端表示收到了这个数据包。
数据包的Flags标志字节的ACK置位,表示是ACK回应数据包。
Acknowledgement number 设置为接收到的数据包的 SEQ + 数据包实际长度,因为接收到的SYN的实际数据长度为0,但是TCP协议认为实际长度为0的主动发送的数据长度为1,SYN是客户端主动发送的数据包,所以服务端把Acknowledgement number 设置为接收到的数据包的 SEQ + 1。
TCP通讯可以是双向的,一旦建立了连接,服务端也可以向客户端发送数据。
所以服务端也会向客户端发送一个SYN包,数据包的Flags标志字节的SYN置位,表示是SYN数据包,同时随机生成一个4字节的数据,作为本次连接通讯服务端数据的起始顺序号Sequence number。
实际中,服务端把这两个数据包合并为一个数据包,SYN和ACK都是置位,Sequence number和Acknowledgement number也同时设置,作为一个数据包发送回客户端。
1.3. 客户端回应ACK
客户端收到服务端的SYN数据包后,需要回应一个ACK数据包,表示接收到此数据包。同样ACK数据包的Acknowledgement number 设置为接收到的数据包的 SEQ + 1(SYN、ACK数据包的实际数据长度也是0)。
2、 相互收发数据
通讯双方建立了连接后,就可以相互进行数据包的传送。
发送数据的一端,把数据包的Flags标准字节的PSH置位,表示是有实际数据的数据包。
Sequence number置为前一次的数据包的Sequence number加上前一次数据包的长度。
如果数据包还兼做ACK包,则把ACK置位,同时设置好Acknowledgement number把数据包发送到对方。
接收方收到对方主动发送的数据数据包后,一定要回复ACK数据包,如果同时有数据发往对方,可以把实际数据包跟ACK数据包合在一起发送。
在拆除连接之前,通讯双方可以一直相互发送接收数据,数据的顺序都建立在各自的Sequence number基础上。
图1中,蓝色部分的数据通讯就表示这一阶段。
3、 拆除连接
双方数据交换完毕,需要拆除连接,结束通讯。
3.1. 客户端发送FIN
通讯的一方向另一方发送FIN数据包表示要结束通讯,拆除连接。
客户端把数据包的Flags标准字节的FIN置位,表示是通讯结束数据包。
3.2. 服务端返回ACK,FIN
服务端收到客户端的FIN数据包后,先回应一个ACK数据包,然后也发送一个FIN数据包,还是服务端也结束通讯。
3.3. 客户端回应ACK
客户端回应ACK表示接收到服务端的FIN数据,双方通讯结束。
TCP/IP 协议简单分析的更多相关文章
- TCP/IP协议简单介绍
TCP/IP协议族总共分为四层,分别为: 应用层:应用层协议有Telnet(远程登入协议).FTP(文件传输协议).SMTP(简单邮件传送协议).SNMP(简单网络管理协议).HTT ...
- TCP/IP协议分析
一;前言 学习过TCP/IP协议的人多有一种感觉,这东西太抽象了,没有什么数据实例,看完不久就忘了.本文将介绍一种直观的学习方法,利用协议分析工具学习TCP/IP,在学习的过程中能直观的看到数据的具体 ...
- wireshark抓包分析——TCP/IP协议
本文来自网易云社区 当我们需要跟踪网络有关的信息时,经常会说"抓包".这里抓包究竟是什么?抓到的包又能分析出什么?在本文中以TCP/IP协议为例,简单介绍TCP/IP协议以及如何通 ...
- TCP/IP协议分析(推荐)
一;前言 学习过TCP/IP协议的人多有一种感觉,这东西太抽象了,没有什么数据实例,看完不久就忘了.本文将介绍一种直观的学习方法,利用协议分析工具学习TCP/IP,在学习的过程中能直观的看到数据的具体 ...
- TCP/IP协议第一卷第三章 IP首部分析
IP介绍 IP是TCP/IP协议族中最为核心的协议.所有的TCP.UDP.ICMP.IGMP数据都以IP数据报格式传输. IP提供不可靠.无连接的数据报传送服务. 不可靠(unreliable)它不能 ...
- Ripple 20:Treck TCP/IP协议漏洞技术分析
本文由“合天智汇”公众号首发,作者:b1ngo Ripple 20:Treck TCP/IP协议漏洞技术分析 Ripple20是一系列影响数亿台设备的0day(19个),是JSOF研究实验室在Trec ...
- HTTP协议—— 简单认识TCP/IP协议
大学没读计算机专业,所以很多的专业知识都不知道.既然已经从事了IT这个行业,就势必要去了解下网络底层,虽然实际工作中这些东西用不到.高楼大厦,起于平川.不积跬步,无以至千里,不积小流,无以成江海.我现 ...
- Tcp/Ip协议族简单解读及网络数据包/报/帧数据格式及封装及解包;
http://www.creseek.cn/products-install/install_on_bsd_linux/ 中文检索 离线cloudera ecosystem components: h ...
- 简单聊聊HTTP/TCP/IP协议
经过几天的面试,有很多公司的面试官都会问到是否了解HTTP/TCP/IP协议? 一遇到这个问题,就一脸懵逼,虽然是计算机基层的东西,看来是必须得了解的,回到家之后,就查找了一些资料,整理了一篇博客,简 ...
随机推荐
- bzoj3963[WF2011]MachineWorks cdq分治+斜率优化dp
3963: [WF2011]MachineWorks Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 270 Solved: 80[Submit][S ...
- JavaBean实现用户登陆
本文简单讲述使用javabean实现用户登录,包括用户登录,注册和退出等. 系统结构图 2.数据库表 create table P_USER ( id VARCHAR2(50) not n ...
- sharepoint环境安装
SharePoint 2013 测试环境安装配置指南 软件版本 Windows Server 2012 标准版 SQL Server 2012 标准版 SharePoint Server 2013 企 ...
- Triangle(动态规划)
题目描述 Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjac ...
- SAS中的剔除空格函数
left函数: 刪除字符串左边(开头> 的空格right函数: 刪除字符串右边(结尾> 的空格trim函数: 刪除字符串右边(结尾> 的空 ...
- dict的操作和三级菜单
dict的基本操作 # Author:nadech info = { "stu001":"sjp", "stu002":"cxx& ...
- 小知识点 取消button动作 和取巧按钮高亮
如果让按钮在点击时不变暗 进行下面设置: 如果使butten失去动画效果进行下面设置:(一般用于图片+文字,效果等于可以加图片班的label,当然label不能加图片)
- webpack4.1.1的使用详细教程
安装全局webpack cnpm install -g webpack 安装全局webpack-cli npm install -g webpack-cli 初始化:生成package.json文件 ...
- Go 语言函数
函数是基本的代码块,用于执行一个任务. Go 语言最少有个 main() 函数. 你可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务. 函数声明告诉了编译器函数的名称,返回类型,和参数. ...
- jQuery 遍历 – 祖先
祖先是父.祖父或曾祖父等等. 通过 jQuery,您能够向上遍历 DOM 树,以查找元素的祖先. 向上遍历 DOM 树 这些 jQuery 方法很有用,它们用于向上遍历 DOM 树: parent() ...