0%

TCP-UDP-IP学习

TCP协议

本部分笔记笔记参考网址:

TCP三次握手四次挥手详解 - zmlctt - 博客园

TCP(传输控制协议)_百度百科

基本信息

TCP: 传输控制协议,工作在osi七层模型的传输层上,是一种面向连接的协议,负责端对端网络连接的建立,进程间通信,流量控制、数据校验等功能

SYN:同步序列编号,Synchronize Sequence Numbers

2MSL:2 Maximum Segment Lifetime 2倍报文最大生存时间。

首部格式

首部最长为60个字节,最短为20个字节—当首部中无选项字段时。

Source Port———源端口,16bits,0-65535
Destination Port ————目的端口,16bits,0-65535

Sequence Number————发送数据包中第一个分段的序列号,32bits

Acknowledgement Number—————-确认序列号,32bits

Data Offsset ————数据偏移,32bits,该字段的值是TCP首部长度除以4,用以指定TCP报文段的数据部分起始位置距离TCP报文段的起始位置有多远,该选项存在的意义是tcp首部中存在长度不确定的Options。

标志位———-6bits:

第一位:URG—表示Urgent Pointer字段有意义

第二位:ACK—表示Acknowledgement Numbber 字段有意义

第三位:PUSH—-表示push功能,当两个应用程序通信时,某一端如果希望当前数据中包含的指令得到尽快的响应,则此时将该数据段的push标志位设置为1,当接受方收到该数据段后,不是将该报文段放置在缓存中排队输送到应用程序,而是立即将其提交到接受方应用程序。

第四位:RST—复位TCP连接,当tcp连接中出现了严重的差错时,将该值设置为1,此时表示要重新建立TCP连接。

第五位:SYN——表示SYN报文

第六位:FIN——表示没有数据可以发送了

Window——表示接受缓冲区的空闲空间,16bits,用来告诉TCP接受对端自己能够接受逇最大数据长度

Checksum——校验和,16bits。在计算校验和时,要在TCP首部的前面加上12个字节的伪首部。

Urgent Pointers ——紧急指针,16位, 只有URG标志位被设置时该字段才有意义,表示紧急数据相对序列号(Sequence Number字段的值)的偏移。表明当前连接中有紧急字段需要发送,此时tcp将该报文段插入到报文段队列的最前方,优先发送

伪首部格式

本部分参考网址:

TCP,UDP伪首部描述_jiangqin115的专栏-CSDN博客_udp伪首部

Source IP——源IP地址,32bits

Destination Ip ———目的IP地址,32bits

填充位———8bits,均填充为0

Protocol———协议位,使用协议的协议号,8bits,tcp为6

Data Segment Length ———数据段长度,16bits

首部并非TCP&UDP数据报中实际的有效成分。伪首部是一个虚拟的 数据结构,其中的信息是从数据报所在IP分组头的分组头中提取的,既不向下传送也不向上递交,而仅仅是为计算 校验和。这样的 校验和,既校验了TCP&UDP用户数据的源 端口号和目的端口号以及TCP&UDP用户数据报的数据部分,又检验了IP数据报的源IP地址和目的地址。伪报头保证TCP&UDP数据单元到达正确的目的地址。因此,伪报头中包含IP地址并且作为计算 校验和需要考虑的一部分。最终目的端根据伪报头和 数据单元计算 校验和以验证通信数据在传输过程中没有改变而且到达了正确的目的地址。

TCP连接建立与终止

建立连接-3次握手

TCP三次握手:

  1. 客户端发送SYN(Seq=x,初始序号,存储在报头的Sequence Number中),SYN标志位为1,ACK标志位为0,的报文给服务器端,进入SYN_SEND状态
  2. 服务器接收到SYN报文,回应一个SYN(seq=y)+ACK(ACK = x+1),SYN与ACK标志位同时为1的报文给客户端,进入SYN_RECV状态。
  3. 客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1),SYN标志位为0,ACK标志位为1的包给服务器,进入established状态。

至此,TCP客户端与服务器端的连接被建立起来,可以进行相互间的数据传输了

  1. 某个应用进程首先调用close,称该端执行“主动关闭”,该端的TCP于是发送一个FIN分节,表示数据发送完毕,此时主动方将关闭发送服务。
  2. 接受到这个FIN的对端执行“被动关闭”,这个FIN由TCP确认,发送ACK包给主动方。FIN的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程,放在已排队等候该应用进程接收的任何其他数据之后,因为,FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。
  3. 一段时间后,接受到这个文件结束符的应用进程将调用close关闭它的套接字。这导致他的tcp也发送一个FIN+ACK,进入LAST-ACK状态。
  4. 接受端接受到这个FIN后,其TCP确认这个FIN向被动方发送ACK包。从而进入TIME_WAIT状态。等待2MSL之后,如不再有新的ACK+FIN包传来,则主动方关闭接收服务(被动方若超过msl之后仍没有收到确认包,则会重发FIN_ACK包,主动方在2msl之后再关闭服务则能确保能够收到来自被动方的重发包)。

可靠性实现

重传策略

TCP在发送一个数据段后立即启动一个定时器,如果在重传超时时间内接收到确认就关闭该重传,如果未接收到确认,则重传该数据段。

可靠性

  1. 校验和:TCP将保持他首部和数据的校验和。这是一个端到端的校验和,目的是检测数据在传输过程中的任何变化。如果收到段的校验和有差别,TCP将丢弃这个报文段并且不确认这段报文。
  2. 数据包顺序:通过IP数据报的方式传送,因为路由选择的不同可能在成数据包的失序。报文头中的Sequence Number就是接受端重新进行包排序的依据,也是删除重复包的依据
  3. 流量控制:TCP接受端都有固定大小的缓冲空间,双方通过SYN中的MSS协商发送、接受数据的大小,从而防止缓冲区的溢出。

窗口确认

使用数据报头序列号及确认号来确认已收到包含在数据段的相关的数据字节。

源主机在收到确认消息之前可以传输的数据的大小称为窗口大小

其他

MSS协商

在TCP建立连接的三次握手中,有一种很重要的工作那就是进行MSS协商。连接的双方都在SYN报文中增加MSS选项,其选项值表示本端最大能接收的段大小,即对端最大能发送的段大小。连接的双方取本端发送的MSS值和接收对端的MSS值的较小者作为本连接最大传输段大小。

发送SYN报文时的MSS选项值的计算方法如下。

l非直连网络中:mss = 默认值536。

l直连网络中:mss = 对端ip地址对应的出口的MTU - 20字节ip头 - 20字节tcp头。

若连接过程中发送端或者接受端协商的MSS超过路由器允许的最大值,路由器则会拒绝转发。怎么解决这个问题呢,在tcp连接的建立过程中进行syn协商时,路由器会进行解包,如果发现mss超过限制,则会对该值进行修改,再重新封装发送。

PMTU发现

PMTU:路径最大传输单元。

当设备发现当前的PMUT比双方协商的mss小时,则设备就会按一定的时间间隔去尝试发现更大的PMTU,指导PMTU达到最大值。

SYN攻击

在三次握手的过程中,服务方在接受了请求方的SYN后发送SYN+ACK回报,同时进入SYN_RECV状态,若在设置的时间阈值之后仍然没有收到请求方的ACK包,则服务方将重发SYN+ACK包,知道达到设定的重发次数为止。SYN攻击则是利用这一过程,使用大量的虚假IP不断的发起SYN请求却不发送ACK回包,这样这些伪造的SYN包将占用未连接队列,使正常的SYN请求被丢弃,导致目标系统运行缓慢,甚至导致网络堵塞或系统瘫痪。

主动方最后发送ACK包后为什么需要进入TIME_WAIT状态?TIME_WAIT状态的持续时间为什么是2MSL

当主动方发送了最后的ACK包后,并不能完全确保被动方接收到了该包。如果该包在传输过程中发生了丢失,那么被动方在等待了设定的超时响应时间之后则会重传FIN包,此时主动方是处于TIME_WAIT状态的,在2msl时间内则是为了确保主动方能够接收到被动方重发的FIN包。这样可以确保TCP全双工连接的可靠终止,同时也能确保老的重复的分节在网络中消逝,主动方在等待2MSL之后就可以上使所有在连接过程中产生的报文段在网络中消失,因为处于TIME_WAIT状态的分节是不允许绑定的。

为什么需要进行三次握手,两次握手可以吗

不可以,两次握手可能造成死锁。当请求方发送SYN后,服务方回ACK+SYN包,按照两次握手的情况,如果服务方的ACK包在发送过程中丢失,服务方自己却不知情,在发送了ACK包后,他就开始传送数据,请求方因为未收到来自服务提供方的ACK包,那么将一直处于SYN_SEND状态,服务方发过来的正常数据包将被请求方丢弃,而服务方则因为自己发送的数据包未收到来自请求方的确认包,分组超时后将重发相同的分组,从而造成死锁。

UDP协议

本部分笔记参考网址:

UDP_百度百科

不为人知的UDP:深入地理解UDP协议并用好它

基本情况

UDP:用户数据包协议。是一种面向事务的,连接不可靠的传输层协议。不能提供数据的分组、组装、排序,因为首部简短,所额外开销据较少,流量的开销较少,在传输过程中的延迟小,数据的传输效率高,适合对可靠性要求不高的程序。特别适用于发送那些简短的数据,同时UDP协议是一种一对多的协议,所以在直播领域、视频会议领域,多媒体数据的传输等方面多使用。其可靠性与分组都有应用层完成,如DNS、TFTP、SNMP等协议

UDP报头

总共8个字节,分为4个域,每个域2个字节。

Source Port ———源端口,16bits,0-65535

Destination Port———目的端口,16bits,0-65535

数据长度———16bits,UDP报文段的长度,最短为8(仅首部)

Checksum———16bits,整个数据段的校验和,接受端接受到该报文段后,计算校验和,若计算出的校验和与该值相等则保留该数据段,若不相等则丢弃该数据段。该值不是必须的。

UDP伪报头

Source IP——源IP地址,32bits

Destination Ip ———目的IP地址,32bits

填充位———8bits,均填充为0

Protocol———协议位,使用协议的协议号,8bits,UDP为17

Data Segment Length ———数据段长度,16bits

首部并非TCP&UDP数据报中实际的有效成分。伪首部是一个虚拟的 数据结构,其中的信息是从数据报所在IP分组头的分组头中提取的,既不向下传送也不向上递交,而仅仅是为计算 校验和。这样的 校验和,既校验了TCP&UDP用户数据的源 端口号和目的端口号以及TCP&UDP用户数据报的数据部分,又检验了IP数据报的源IP地址和目的地址。伪报头保证TCP&UDP数据单元到达正确的目的地址。因此,伪报头中包含IP地址并且作为计算 校验和需要考虑的一部分。最终目的端根据伪报头和 数据单元计算 校验和以验证通信数据在传输过程中没有改变而且到达了正确的目的地址。

其他

UDP报文段数据部分长度

  • UDP数据包数据段的理论最大长度:

    1. udp协议本身规定了其有16位的报文长度,则其报文长度不能超过2^16=65536。
    2. 报头占8字节
    3. IP报头占20字节

    则其理论长度为:65536-1-8-20=65507字节。

  • 实际最大长度:

    1. UDP发送缓存区大小限制
    2. 以太网发送数据帧的长度限制
    3. 数据链路层MTU限制
  • 理想长度:

    受以太网传输电气方面的限制,每个以太网帧最小字节为64,最大为1518字节,超过这个范围的帧均被视为错误真丢弃,在减掉以太网帧的帧头部分(DMAC目的 MAC 地址48bit=6Bytes+SMAC源 MAC 地址48bit=6Bytes+Type域(上层协议类型,用以接收端判断将数据部分上送到哪一种协议-icmp,ip,arp)2bytes)共14字节,和帧尾部分的CRC—-循环冗余校验部分,能够承载上层协议的数据域最大只能为1500字节,即为MTU。那么要想IP层不分包,那么UDP数据包的最大值为1500-20-8=1472字节。鉴于Internet的标准MTU值为576字节,故建议UDP的数据长度控制在(576-8-20=548字节)以内。

    采用冗余传输方案:延时双发-将原本单发的前后连续的两个包合并成一个大包发送。

如何获取完整的UDP包

采用冗余传输方案:延时双发-将原本单发的前后连续的两个包合并成一个大包发送。

IPv4协议

本部分笔记参考:

Red_Code

基本介绍

IP:Internet Protocol,网际互连协议,其工作在OSI参考模型的网络层上,提供一种无连接的、不可靠的、尽力而为的数据包传输服务。

主要内容

IP分组转发规则

  • 直接交付:

    当IP数据包经由路由器转发时,如果目标设备与本地路由器直接相连,则直接将数据包交付给目标主机

  • 间接交付

    若目标主机未与本地路由器直接相连,路由器通过查找路由表,并将数据包转交给路由表中指明的下一跳路由器。若路由表中有到达目标网络的路由,则吧数据包传送给指明的吓一跳路由器,如果没有路由,则将数据包传送给路由表中的默认路由。如果两者都没有则丢弃数据包并报告错误

IP分片

当路由器在转发IP数据包是,如果包的大小大于当前链路的MTU,路由器则会将该IP分组分节成满足MTU的数据包,进行传输,并在到达目标主机时才被进行重组。

IP分组结构

由首部与数据量部分组成,首部包好20字节的固定部分以及可选部分

IP报文首部

IP Version———IP版本号,4bits,ipv4-0100、ipv6-0110

Hdr Len———头部长度,4bits。一个位表示4个字节,即最大可以表示60个字节长度,一般为0101=0d5,即20个字节。

Type of Service(QOS、TOS)——优先级及服务类型,8bits,前三位为优先级,中间3位为服务类型,D:低延时,T高吞吐量,R高稳定性,后两位为ECN。QOS:提供了8种服务优先级,优先级越高的报文将被优先处理。TOS:提供了三种不同的服务类型,分别为D-低时延,T-高吞吐量,R-高可靠性。ECN:当一个带有ECN标志的分组被发送后,如果接收端“”持续拥塞且具有“感知ECN”的能力,那么接收端会通知发送端降低发送速度。

Total Length———总长度,16bits,单位:字节,首部与数据部分之和的长度,单位为字节,故数据报的最大长度为65535个字节,但受MTU的限制,此值只是理论上的值。

Indentification(Fragment ID)-标示,16bits,为片分类,数据在数据链路层会进行分片操作,此标志表示该分片属于某一帧。

R——1bit 保留

DF——1bit,Do not Fragment ,是否分片,1表示未分片,0表示已分片

MF——1bit,More Fragment,是否最后一片,0表示是最后一个分片,1表示不是

Fragment Offset——,13bits,片偏移,后一个片从前一个片的哪个位置开始拼接,单位为:8Bytes

Time To Live(TTl)——8bits,最大生存时间,数据帧每经过一个路由器该值就减1,当该值为零时,数据将被丢弃,丢弃的网络设备将给发送方回包。防止数据在网络上无限循环。linux一般小于100,windows一般大于128。

Protocol———8bits,协议号:TCP-6,UDP-17,IP-0x0800,ARP-0x0860

Header Checksum——-16bits,首部校验和

Source IP Address——16bits,源IP地址

Destination IP Address——-16bits,目的IP地址

Options———40Bytes,可选项:一般一些特殊的要求会加在这个部分。例如:松散路由,严格路由,路由记录,时间戳。

Data———数据部分

IP报头举例:

0100 0101 00000000 0000000000101000 1100000101111010 010 0000000000000 01000000 00000110 0000001000000101 11000000 10101000 00000011 00000111 11001010 01011001 11101001 01000111

  • 1-4bit:0100——IPv4
  • 5-8bit:0101——首部长度为20字节
  • 9-16bit:00000000———服务类型与优先级
  • 17-32bit:0000000000101000 ——整个IP包的长度,40字节
  • 33-48bit:1100000101111010——-49530,片标识
  • 49-51bit:010 ———第一位保留,未分片,是最后一个分片
  • 52-64bit:0000000000000———未曾分片,故无偏移
  • 65-72bit:01000000———64,生存时间
  • 73-80bit :00000110———6,TCP协议
  • 81-96bit :0000001000000101 ———517,首部校验和
  • 97-128bit :11000000 10101000 00000011 00000111——-192.168.3.7 源IP地址
  • 129-160bit : 11001010 01011001 11101001 01000111———202.89.233.71 目标IP地址

IPv4地址

IP地址构成

IPv4地址由32位二进制组成,每8位划分为1组,转换为十进制表示为xxx.xxx.xxx.xxx,这种表示方法被称为点分十进制

IPv6地址由128位二进制组成,每16位划分为一组,每一组内每4位有一个16进制数表示

IPv4地址分类:

A类:0~127,二进制第一位为0,即0xxxxxxxx

B类:128~191,二进制第一位为1,第二位为0,即10xxxxxx

C类:192~223,二进制第一位为1,第二位为1,第三位为0,即110xxxxx

D类:224~239,二进制第一位为1,第二位为1,第三位为1,第四位为0,即1110xxxx,组播地址

E类:240~255,二进制第一位为1,第二位为1,第三位为1,第四位为1,即1111xxxx

如何获取一个IP地址的子网标识?

将该IP地址与其子网掩码进行按位与运算即得到其子网地址

如何获取一个IP地址的广播地址?

将该IP地址的子网掩码按位取反之后再与该IP进行按位或操作即可。

特殊IPv4地址

  • 127.0.0.0/8:回环地址,表示该设备本身
  • 当主机号为0时表示该网络本身,即该网络里的第一个地址:如,192.168.2.0/255.255.255.0
  • 当主机号为255时表示该网络的广播地址,即该网络的最后一个地址
  • 255.255.255.255 为整个互联网的广播地址

IPv4地址耗尽解决方案

传统的IPv4地址被认为的划分为不容的种类,其网络号被限定在8、16、24位,新的解决方案突破了这个限制通过前缀来限定不同的网络,也就没有了地址分类这种说法,扩大了IP地址的可利用率。如:10.0.0.1/18,其中的18表示该IP地址中前18位表示了网络号,后12位表示主机号。

Buy me a coffee.

欢迎关注我的其它发布渠道