1、TCP报文头格式
TCP协议是传输层协议,它基于IP协议做可靠的数据传输。所以TCP报文在网络中传输时是存放在IP报文的Data字段中的,报文格式如下:
帧头 | Data(IP报文) | FCS | |||
IP头 | Data(TCP报文) | ||||
TCP头 | Data |
TCP头字段较多,这里将连续的字段做换行处理。
Source Port | Destination Port | Sequence Number | Acknowledge Number | Header length | |
16位 | 16位 | 32位 | 32位 | 4位 |
Resv | URG | ACK | PSH | RST | SYN | FIN | Window | Checksum | Urgent Pointer | Options | |
6位 | 1位 | 1位 | 1位 | 1位 | 1位 | 1位 | 16位 | 16位 | 16位 | 0-40字节 |
Source Port:源端口号
Destination Port:目的端口号
Sequence Number:首字节序号。TCP报文也是分段传输的,TCP的数据流为每一个字节都分配了序号,报文中记录其首字节的序号。如前一个报文段的首字节序号为100,而报文总长度为300字节,则下一报文段的首字节序号为400。
Acknowledge Number:确认序号。记录了下一报文段的首字节序号。
Header length:报文头长度。因Options字段长度可变,所以TCP报头的长度可变。
Resv:保留字段。供往后应用。
URG:紧急标志位。当URG=1时,表明此报文应尽快传送,而不要按本来的队列次序传送。
ACK:确认标志位。只有当ACK=1时,前面的确认序号字段才有意义。
PSH:急迫标志位。当PSH=1时,表明接收到此报文的主机应立即将此报文段传送至应用层,而不要等所有报文段都到齐了再向上交付
RST:复位标志位。当RST=1时,表明出现了严重的错误,接收到此报文的主机应与源主机断开并重建连接。还可以用来拒绝一个非法的报文段或拒绝打开一个连接。
SYN:同步标志位。在建立连接时使用,SYN=1表示这是一个连接请求或连接接受报文。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,应返回一个SYN=1和ACK=1的报文段。
FIN:终止标志位。用来释放一个连接,当FIN=1时,表明需要发送的报文段已发完,并要求释放传输连接。
Window:窗口字段。用来告知对方自己缓存区的大小,目标主机通过这个字段来确定返回给源主机的数据量最大值,也就是一个报文段的最大长度。
Checksum:校验和字段。校验范围包括首部和数据,由发送方填写接收方验证。
Urgent Pointer:紧急指针。它指出报文中紧急数据最后一个字节的序号。因为紧急数据有可能被分段发送,所以需要指明紧急数据的最后一字节,接收方接收完全后才能处理。只有当紧急标志位URG=1时此字段才有效。
Options:可选字段。TCP报文提供此字段用作功能扩展,包括窗口扩大和时间戳选项,后面会详细讲到。
2、TCP连接(三次握手)
三次握手中,使用了SYN标志位表明这是一个连接请求或连接接受报文;使用了seq(Sequence Number)字段和ack(Acknowledge Number)字段,用以校验报文的连续性;被连接主机使用ACK标志位表明同意连接。这里一般层连接的发起方为client端,被连接方成为server端,连接过程分为三次如下图所示。
第一次握手(SYN_SENT):Client向Server端发送一个请求报文,报文中SYN=1、Sequence Number=一个随机值J,Client进入SYN_SENT状态,等待Server确认。
第二次握手(SYN_RCVD):Server端收到该请求报文后,向Client返回一个确认报文,报文中SYN=1、ACK=1、Acknowledge Number=J+1、Sequence Number=一个随机值K,Server进入SYN_RCVD状态,等待Client端的再次确认。
第三次握手(ESTABLISHED):Client收到该确认报文后,认可连接已建立,于是向Server端发送一个连接建立的确认报文,报文中ACK=1、Acknowledge Number=K+1。Server端收到该报文后知道Client端已认可了本次连接,于是Client和Server就可以开始传输数据了。
3、TCP断开(四次挥手)
四次挥手中使用FIN标志位表明这是一个申请连接释放的报文;使用seq(Sequence Number)字段和ack(Acknowledge Number)字段,用以校验报文的连续性;被断开主机使用ACK标志位表明同意断开连接。因为TCP连接是全双工的,所以每个方向都必须单独进行关闭,各方向关闭均需两次共四次如下图所示。
第一次挥手(FIN_WAIT_1):Client发送一个关闭连接的请求报文,报文中FIN=1、Sequence Number=一个随机值M,Client进入FIN_WAIT_1状态,等待Server确认。
第二次挥手(CLOSE_WAIT):Server端收到该关闭的请求报文后,向Client返回一个确认报文,报文中ACK=1、Acknowledge Number=M+1,Server进入CLOSE_WAIT状态。Client端收到确认报文后就断开与Server的连接。
第三次挥手(LAST_ACK):Server端发送一个关闭连接的请求报文,报文中FIN=1、Sequence Number=一个随机值N,Server进入LAST_ACK状态,等待Client确认。
第四次挥手(TIME_WAIT):Client收到该关闭的请求报文后,向Server返回一个确认报文,报文中ACK=1、Acknowledge Number=N+1,Client进入TIME_WAIT状态。Server端收到确认报文后就断开与Client的连接,至此双向的连接都已关闭。
4、UDP报文头格式
UDP与TCP类似都是传输层协议,也是基于IP协议的,所以在传输时也是存放于IP报文的Data字段中。与TCP不同的是它是一种无连接的传输协议,它不提供数据包分组、组装和不能对数据包进行排序,也就是当报文发送后,是无法得知其是否安全完整的到达。
帧头 | Data(IP报文) | FCS | ||||||
IP头 | Data(UDP报文) | |||||||
UDP头 | Data | |||||||
Source Port | Destination Port | Length | Checksum | |||||
8位 | 8位 | 8位 | 8位 |
Source Port:源端口号。
Destination Port:目的端口号。
Length:总长度。报文的长度。
Checksum:校验和。接收方用于校验传输是否正确。
【为什么TCP关闭是四次挥手】由于TCP连接是全双工的。
也就是说Clinet和Server端是可以同时收发的,在进行关闭时,若Client端关闭了Client到Server端的连接,但此时Server端可能还有数据没有发完,所以需要等到Server端也发完数据后,Server主动向Client发起关闭请求。可以这样理解,TCP连接后,Server和Client各自发送自己的数据,发送完毕后各自断开连接。应当将Client和Server连接断开看作是两次不连续的事件,实际上也会出现Server端先断开连接或Client和Server同时断开连接,所以需要四次握手。
【TCP可选字段】可选字段的第一个字节称为kind,说明选项的类型。默认kind为空,即不启用Options字段。
kind=0:禁用此字段。
kind=1:启用窗口扩大选项。此选项使TCP的窗口定义从原来的16位扩大到32位,就是说发送方的缓存区能支持从最大能支持65535字节到最大能支持4294967295字节。
kind=2:启用时间戳选项。此选项使发送方在每个报文段中放置一个时间戳,接收方会在确认收到的报文中带上这个数值,这样发送方就能计算报文段在网络中的往返延迟。
kind=3:启用窗口扩大和时间戳选项。
【TCP与UDP的区别】UDP和TCP协议的主要区别是两者在如何实现信息的可靠传递方面不同。
TCP协议中包含了专门的传递保证机制,当数据接收方收到发送方传来的信息时,会自动向发送方发出确认消息;发送方只有在接收到该确认消息之后才继续传送其它信息,否则将一直等待直到收到确认信息为止。与TCP不同,UDP协议并不提供数据传送的保证机制。如果在从发送方到接收方的传递过程中出现数据报的丢失,协议本身并不能做出任何检测或提示。而且在网络拥堵时可能出现先发出的数据后到达的情况,也就是接收方收到数据的顺序可能与发送方不一致。因此,通常人们把UDP协议称为不可靠的传输协议。
【UDP应用】既然UDP是一种不可靠的网络协议,那么还有什么使用价值或必要呢?
其实不然,在有些情况下UDP协议可能会变得非常有用。因为UDP具有TCP所望尘莫及的速度优势。虽然TCP协议中植入了各种安全保障功能,但是在实际执行的过程中会占用大量的系统开销,无疑使速度受到严重的影响。反观UDP由于排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使速度得到了保证。同时UDP也是分发信息的一个理想协议。例如,在屏幕上报告股票市场、在屏幕上显示航空信息等等。UDP也用在路由信息协议RIP(Routing Information Protocol)中修改路由表。在这些应用场合下,如果有一个消息丢失,在几秒之后另一个新的消息就会替换它。
【TCP与UDP的端口号】TCP与UDP协议使用端口号为不同的应用保留其各自的数据传输通道。
UDP和TCP协议正是采用这一机制实现对同一时刻内多项应用同时发送和接收数据的支持。数据发送一方(可以是客户端或服务器端)将UDP数据包通过源端口发送出去,而数据接收一方则通过目标端口接收数据。有的网络应用只能使用预先为其预留或注册的静态端口;而另外一些网络应用则可以使用未被注册的动态端口。因为UDP报头使用两个字节存放端口号,所以端口号的有效范围是从0到65535。一般来说,大于49151的端口号都代表动态端口。
实际上TCP和UDP是基础的传输协议,基于这二者实现的应用层协议可能有固定的端口号,如ftp服务进行TCP通讯时默认使用21号端口,有些应用也可能临时申请一个端口,通信完成后就释放该端口,由计算机统一管理
原文地址:http://bigmaomao.blog.51cto.com/1531641/1845142