TCP/IP 协议简单分析(建立连接握手过程)

原文:http://hi.baidu.com/wuguoyana/blog/item/38c04d3bcf047ce43a87ce55.html

首先TCPIP是两种不同的协议,它们来七层网络模型中分别在不同的层次,IP协议是网络层的协议,TCP是更高一层的传输层的协议,TCP是建立在IP协议之上的,所以一般把TCPIP连在一起说TCP/IP协议。

Windows系统的TCP协议栈的数据包默认是1460字节大小,如果一次传输的数据大于这个长度,会把分割成几个长度都不大于1460字节的TCP数据包,每个数据包都会被赋予一个sequnce number(相当于每个数据包的顺序号,凭这个接收端可以知道数据包的前后顺序)

之后TCP的数据包再被包裹上一层IP的数据的头,形成IP数据包在网上传输(其实最后还要包一层以太网数据包,网络上最终传输的都是以太网数据包)。

IP数据包到了目的地后,接收端首先把IP数据包的包头去掉,取出TCP的包。接收端每收到一个TCP的数据包都需要返回给发送端一个ACK的数据包告诉发送端已接到此数据包,如果接收端在一定的时间内没有收到某个数据包的ACK响应,会再次发送这个数据包,这样就保证了数据都能被接收端接收到(因特网上丢数据包是很正常的事,如果没有数据包重发机制,很难保证发送的数据都能被接收端完整的收到)。

每个TCP数据包也是由包头和实际数据组成,包头包含如下主要内容:

l        Source port2字节)

发送端的端口号

l        Destination port2字节)

接收端的端口号

TCP包头中只包含双方的端口号,双方的IP地址在IP包的包头,所以在TCP数据包的包头中没有IP地址。

l        Sequence number4字节)

数据的顺序号,表示当前数据包中的数据起始顺序号,比如前一个数据包的SEQ为十六进制的:df d5 aa 3d,数据包的实际数据长度为16字节,那么下一个数据包的SEQ就要在前一个数据包的SEQ基础上加上16,为:df d5 aa 4d

l        Acknowledgement number4字节)

接收到对方的某个数据包后的回应顺序号。如果接收到了对方主动发送来的某个数据包,必须要返回对方一个ACK回应数据包,数据包的头部的Acknowledgement number部分根据对方发送数据的SEQ和实际数据长度,返回SEQ +实际数据长度,表示已经接收到这个数据包。对方收到这个回应,根据数值计算后知道这个数据包已经被对方接收。如果接收不到ACK的回应,就意味着这个数据包已经在网上被丢失,需要重新发送此数据包。

l        Header length1字节)

表示TCP数据包的包头长度,整个TCP数据包的长度减包头长度就能得到TCP数据包的实际传送的数据长度。

l        Flags1字节)

标志字节,每一位都是一个标志,以下是几个主要标志:

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.   服务端回应ACKSYN

服务端收到客户端的SYN后,首先要发送一个ACK数据包给客户端表示收到了这个数据包。

数据包的Flags标志字节的ACK置位,表示是ACK回应数据包。

Acknowledgement number设置为接收到的数据包的SEQ +数据包实际长度,因为接收到的SYN的实际数据长度为0但是TCP协议认为实际长度为0的主动发送的数据长度为1SYN是客户端主动发送的数据包,所以服务端把Acknowledgement number设置为接收到的数据包的SEQ + 1

TCP通讯可以是双向的,一旦建立了连接,服务端也可以向客户端发送数据。

所以服务端也会向客户端发送一个SYN包,数据包的Flags标志字节的SYN置位,表示是SYN数据包,同时随机生成一个4字节的数据,作为本次连接通讯服务端数据的起始顺序号Sequence number

实际中,服务端把这两个数据包合并为一个数据包,SYNACK都是置位,Sequence numberAcknowledgement number也同时设置,作为一个数据包发送回客户端。

1.3.   客户端回应ACK

客户端收到服务端的SYN数据包后,需要回应一个ACK数据包,表示接收到此数据包。同样ACK数据包的Acknowledgement number设置为接收到的数据包的SEQ + 1SYNACK数据包的实际数据长度也是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.   服务端返回ACKFIN

服务端收到客户端的FIN数据包后,先回应一个ACK数据包,然后也发送一个FIN数据包,还是服务端也结束通讯。

3.3.   客户端回应ACK

客户端回应ACK表示接收到服务端的FIN数据,双方通讯结束。

-----------------------------------------------------------------------------------
以下结合实图解释下(个人理解,不正之处望改正):
使用Wireshark在windows下抓包,可以看到三次握手、Client发送24Byte的请求数据、Server发送240Byte的响应数据、四次挥手的过程!(在linux下用Wireshark抓包效果类似)
Client IP: 192.168.100.2
Server IP: 192.168.100.55
一: 三次握手:
1.1 Client 发送一个SYN数据包给Server,这个数据包的序列号(Seq)为0,窗口大小(Win)为65535,数据长度(Len)为0,最大分段大小(MSS)为1460。后面的不知道啥意思了。
1.2 Server 收到SYN数据包后要给Client答复,发送一个SYN+ACK数据包,这个数据包的序列号(Seq)为0,确认号(ACK)为1,即ACK=收到包的Seq+1,窗口大小(Win)为8704,数据长度(Len)为0。
1.3 Client收到SYN+ACK数据包后也要给Server答复,发送一个ACK数据包,这个数据包的序列号(Seq)为1,确认号(ACK)为1,即ACK=收到包的Seq+1,窗口大小(Win)为65535,数据长度(Len)为0。
二: 发送24Byte的请求数据:
2.1 Client向Server发送一个PSH标志置位的请求数据包,这个数据包与1.3的数据包差不多,唯一不同是数据长度(Len)为24。(为什么与1.3数据包差不多呢?)
2.2 Server收到Client发送过来请求数据包后要给Client答复,发送一个ACK数据包,这个数据包的序列号(Seq)为1,确认号(ACK)为25,即ACK=收到包的Seq+24,窗口大小(Win)为8680,数据长度(Len)为0。
2.3 Server向Client发送一个PSH标志置位的响应数据包,这个数据包与2.2的数据包差不多,唯一不同的是数据长度(Len)为240.(为什么和2.2数据包差不多呢?)
三: 接收240Byte的响应数据:
2.4 Client收到Server发送过来的响应数据包后要给Server答复,发送一个ACK数据包,这个数据包的序列号(Seq)为25,确认号(ACK)为241,即ACK=收到包的Seq+240,窗口大小(win)为65295,数据长度(Len)为0.
四: 四次挥手:
3.1 Client向Server发送一个FIN数据包表示断开连接,这个数据包与2.4的数据包差不多,唯一不同的是数据包FIN标志位置位。(为什么和2.4数据包差不多呢?)
3.2  Server收到Client的FIN数据包后要给Client答复,发送一个ACK数据包,这个数据包序列号(Seq)为241,确认号(ACK)为26,即ACK=收到包的Seq+1,窗口大小(win)为8704, 数据长度(Len)为0.
3.3  Server紧接着发送一个FIN数据包给Client,表示服务器也结束通讯。这个数据包与3.2数据包差不多,唯一不同的是数据包FIN标志位置位。(为什么和3.2数据包差不多呢?)
3.4   Client收到Server发送过来的FIN数据包后要给Client答复,发送一个ACK数据包,这个数据包序列号(Seq)为26,确认号(ACK)为242,即ACK=收到包的Seq+1,窗口大小(Win)为8704,数据长度(Len)为0.
至此,三次握手、Client发送24Byte的请求数据、Server发送240Byte的响应数据、四次挥手的过程结束!
补充:
上述的解释出现好几次“为什么和**数据包差不多呢?”,比如2.1的数据包和1.3的数据包差不多呢。
其实两个数据包可以合并为一个数包发送,我理解为重复显示。
/*******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
TCP/IP(Transmission Control Protocol/Internet Protocol)的简写,中文译名为传输控制协议/互联网络协议)协议是Internet最基本的协议。

TCP/IP整体构架概述

     TCP/IP协议并不完全符合OSI的七层参考模型。传统的开放式系统互连参考模型,是一种通 信协议的7层抽象的参考模型,其中每一层执行某一特定任务。该模型的目的是使各种硬件在相同的层次上相互通信。这7层是:物理层、数据链路层、网络层、传 输层、会话层、表示层和应用层。而TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。这4层分别为:   应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。   传输层:在此层中,它提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。   互连网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。   网络接口层:对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据。

TCP/IP中的协议

1. IP   网际协议IP是TCP/IP的心脏,也是网络层中最重要的协议。   IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更 高层---TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数 据包是按顺序发送的或者没有被破坏。IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。   高层的TCP和UDP服务在接收数据包时,通常假设包中的源地址是有效的。也可以这样说,IP地址形成了许多服务的认证基础,这些服务相信数据包是从一个有效的主机发送来的。IP确认包含一个选项,叫作IP source  routing,可以用来指定一条源地址和目的地址之间的直接路径。对于一些TCP和UDP的服务来说,使用了该选项的IP包好像是从路径上的最后一个系 统传递过来的,而不是来自于它的真实地点。这个选项是为了测试而存在的,说明了它可以被用来欺骗系统来进行平常是被禁止的连接。那么,许多依靠IP源地址 做确认的服务将产生问题并且会被非法入侵。   2. TCP   如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向‘上’传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。   TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。   面向连接的服务(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性,所以它们使用了TCP。DNS在某些情况下使用TCP(发送和接收域名数据库),但使用UDP传送有关单个主机的信息。   3.UDP   UDP与TCP位于同一层,但它不管数据包的顺序、错误或重发。因此,UDP不被应用于那些使 用虚电路的面向连接的服务,UDP主要用于那些面向查询---应答的服务,例如NFS。相对于FTP或Telnet,这些服务需要交换的信息量较小。使用UDP的服务包括NTP(网络时间协议)和DNS(DNS也使用TCP)。   欺骗UDP包比欺骗TCP包更容易,因为UDP没有建立初始化连接(也可以称为握手)(因为在两个系统间没有虚电路),也就是说,与UDP相关的服务面临着更大的危险。   4.ICMP   ICMP与IP位于同一层,它被用来传送IP的的控制信息。它主要是用来提供有关通向目的地址 的路径信息。ICMP的‘Redirect’信息通知主机通向其他系统的更准确的路径,而‘Unreachable’信息则指出路径有问题。另外,如果路 径不可用了,ICMP可以使TCP连接‘体面地’终止。PING是最常用的基于ICMP的服务。   5. TCP和UDP的端口结构   TCP和UDP服务通常有一个客户/服务器的关系,例如,一个Telnet服务进程开始在系统 上处于空闲状态,等待着连接。用户使用Telnet客户程序与服务进程建立一个连接。客户程序向服务进程写入信息,服务进程读出信息并发出响应,客户程序 读出响应并向用户报告。因而,这个连接是双工的,可以用来进行读写。   两个系统间的多重Telnet连接是如何相互确认并协调一致呢?TCP或UDP连接唯一地使用每个信息中的如下四项进行确认:   源IP地址 发送包的IP地址。   目的IP地址 接收包的IP地址。   源端口 源系统上的连接的端口。   目的端口 目的系统上的连接的端口。   端口是一个软件结构,被客户程序或服务进程用来发送和接收信息。一个端口对应一个16比特的 数。服务进程通常使用一个固定的端口,例如,SMTP使用25、Xwindows使用6000。这些端口号是‘广为人知’的,因为在建立与特定的主机或服 务的连接时,需要这些地址和目的地址进行通讯。

转载于:https://www.cnblogs.com/jwyue0520/archive/2012/12/03/2800242.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/296274.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 继承接口语法_java的继承、接口方面的语法及知识

}父类的属性子类中都存在,只是有没有权限访问的问题根据名字找谁是谁?1.变量-> 类型 (类、接口)->接口2.已经确定是变量局部变量、形参->类的属性-> 外部类的属性就近原则构造方法:注意默认的那个无参构造方法优先调用父类的构造…

Linq 下的 Take() 方法内部机制是怎样的?

咨询区 Rahul Kishore:我的web需要访问数据库,但是表比较大,我仅仅想要获取该表中 N 条数据,我查阅了 MSDN 文档,看到了一个 Take() 方法,我现在很疑惑它的运行机制是下面哪一种?先从数据库中获…

【2】开发环境的搭建,Ubuntu14.04

这里使用的是Ubuntu14.04 Unity 更新源 首先,将更新源更换为国内更新源,我这里使用的是网易的更新源 sudo gedit /etc/apt/sources.list 1 deb http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse2 deb http://mirrors.163.com…

如何直接soap字符串,访问webservice

2019独角兽企业重金招聘Python工程师标准>>> 1.Webservice.GetVcardByUserNo(String userId,String userNo);这个是封装了的webservice接口。 2.在程序中连续两次调用该接口时,ksoap2在解析第二次调用返回的结果时抛异常。 异常信息如下&…

百度对301的反应

http://www.admin5.com/article/20111228/400200.shtml转载于:https://www.cnblogs.com/tonykan/archive/2012/12/04/2801449.html

《哈利波特》电影全集+有声书免费领取!带你重返儿时魔法世界……

全世界只有3.14 % 的人关注了爆炸吧知识说到哈利波特系列,几乎人人皆知,享誉世界,风靡全球的哈利波特究竟有什么无穷魔力呢?《哈利波特》是英国作家JK罗琳的魔幻文学系列小说,共7集,其中前六部以霍格沃茨魔…

.NET6下周发布真的香,可不少人却只会.NET Framework!

倒计时7天,.NET6VS2022C#10将同时发布正式版,宣告.NET步入全新篇章,各种新语法、新框架、新技术都如约而至,令人期待!近年来,.NET跨平台持续推出新版本,开源社区也不断涌现各种优秀框架&#xf…

oracle 选择最频繁出现之前,5文章数据

SELECT* FROM(SELECTPROJECT_LISTING.MATERIAL,COUNT (*) AS "出现次数"FROMPROJECT_LISTINGWHEREPROJECT_LISTING.MATERIAL IS NOT NULLGROUP BYPROJECT_LISTING.MATERIALORDER BYCOUNT (*) DESC) WHERE ROWNUM < 5ORDER BYCOUNT (*) DESC 是关键排序COUNT (*)…

java 继承 子类 实例化_关于Java继承中父类和子类构造函数的问题

Java子类在实例化时默认调用的是父类的无参构造函数&#xff0c;不论实例化时调用的是子类的有参还是无参构造函数&#xff0c;1、当父类没有显式定义构造方法时&#xff0c;编辑器会默认为此类添加一个隐式无参构造函数。此时子类可以有自己的无参和有参构造方法。不论实例化时…

收缩临时表空间

当排序操作、重建索引等大型操作无法在内存中完成时&#xff0c;临时表空间将为排序提供便利。一般情况下临时表空间为多个用户&#xff0c;多个会话所共 享。不能为会话分批空间配额。临时表空间耗用过度且在不能自动扩展的情形下将收到“ORA-1652:unable to extend temp segm…

v4L2编程

v4L2编程 v4L2是针对uvc免驱usb设备的编程框架&#xff0c;主要用于采集usb摄像头等&#xff0c;编程模式如下&#xff1a; 一&#xff0e;设置采集方式 打开视频设备后&#xff0c;可以设置该视频设备的属性&#xff0c;例如裁剪、缩放等。这一步是可选的。在Linux编程中&…

java环境怎样搭建_如何学习JAVA?怎么搭建JAVA环境?怎么安装JDK?

JAVA在学习JAVA前&#xff0c;我们必须了解并搭建好JAVA所需的开发环境&#xff0c;要让你写代码能让机器听得懂并执行&#xff0c;JDK(Java Developers Kits)自然是是必须的安装JDK前的准备首先我们要先知道自己的电脑系统是几位版本的&#xff0c;右键”此电脑“点击菜单里的…

神奇的机械动态图,看了一遍又一遍!最后一个真神奇~

全世界只有3.14 % 的人关注了爆炸吧知识神奇的机械科技动态图&#xff0c;看了一遍又一遍&#xff01;最后一个真神奇&#xff5e;▲金属切割的慢镜头&#xff0c;美&#xff01;▲齿轮变速原理演示▲塑料成型机器▲切丝的食品机器▲螺旋状的通心粉制造▲高温融化锁的过程▲一次…

Envoy实现.NET架构的网关(三)代理GRPC

.NET网关与Gateway实战-Envoy与kong课程Envoy实现.NET架构的网关&#xff08;一&#xff09;静态配置与文件动态配置Envoy实现.NET架构的网关&#xff08;二&#xff09;基于控制平面的动态配置什么是GRPCgRPC是一种与语言无关的高性能远程过程调用 (RPC) 框架。gRPC 的主要好处…

Linux 下用来查询安装包信息的RPM选项

Linux 下用来查询安装包信息的RPM选项RPM是RedHat的包管理器&#xff0c;用来安装、卸载、升级和查询基于RedHat Linux的安装包。RHEL和基于它的系统使用rpm命令来完成这些功能。AD&#xff1a;RPM是RedHat的包管理器&#xff0c;用来安装、卸载、升级和查询基于RedHat Linux的…

C#_空值判断

(1) nullnull 关键字是表示不引用任何对象的空引用的文字值。null 是引用类型变量的默认值。那么也只有引用型的变量可以为null &#xff0c;如果 int inull,的话&#xff0c;是不可以的&#xff0c;因为Int是值类型的。(2)""、String.Empty、String.Length 0 这两个…

如何用Java讲一句话重复五遍_Java 0515 第二次课作业

import java.util.*;public class Work_01 {public static void main(String[] args) {Scanner scan new Scanner(System.in);System.out.println("上午是否合格?");String judge scan.next();//输入是否while(!"是".equals(judge)){//用equals方法判断…

C专家编程复习摘要一

一、关于类型转换 K&R C的不说了&#xff0c;说了还容易混淆&#xff0c;只说ANSI C的&#xff1a; 如果其中一个操作数的类型是unsigned long int&#xff0c;那么另外一个操作数也被转换为unsigned long int。其次其中一个操作数的类型是long int&#xff0c;而另一个操作…

一张图看懂华为计算全联接2020

全世界只有3.14 % 的人关注了爆炸吧知识END◆ 推荐阅读 ◆点击下方图片即可阅读华为邓泰华&#xff1a;让每一位开发者的智慧汇聚成全生态创新&#xff0c;共同点亮多样性计算新时代左右滑动查看更多☟

独立开发一个云(PaaS)的核心要素, Go, Go, Go!!!

最近一年的工作&#xff0c;有很大的比重在做云平台的事情&#xff0c;简单来说&#xff0c;就是为公司内用户提供一个PaaS&#xff0c;用户可以在我们的云平台上方便的将单机服务程序扩展为多实例程序&#xff0c;以平台服务化的方式对外提供。在这里简单分享一下。 首先简单说…