TCP/IP浅学

参考:https://www.cnblogs.com/fengzanfeng/articles/1339347.html

综述

TCP/IP不是一个协议,而是一个协议族的统称。电脑通过这些协议和其他的计算机通信。

最上面是应用层,这里面有httpftp,等协议。

第二层是传输层TCPUDP协议就在这个层次。

第三层是网络层IP协议就在这里,它负责对数据加上IP地址和其他的数据以确定传输的目标。

第四层是数据链路层,这个层次为待传送的数据加入一个以太网协议头,并进行CRC编码,为最后的数据传输做准备。再往下则是硬件层次了。

发送协议的主机从上自下将数据按照协议封装,而接收数据的主机则按照协议从得到的数据包解开,最后拿到需要的数据。

端口号(port)

端口号是用在TCPUDP上的一个逻辑号码,并不是一个硬件端口。例如某一个UDP程序A在系统中注册了3000端口,那么,以后从外面传进来的目的端口号为3000UDP包都会交给该程序。端口号理论上可以有65536个。因为它的长度是16bit.

 

数据链路层

数据链路层有三个目的:

  1. ·            IP模块发送和接收IP数据报。
  2. ·            ARP模块发送ARP请求和接收ARP应答。
  3. ·            RARP发送RARP 求和接收RARP应答

数据链路层的协议还是很多的,有我们最常用的以太网(网卡)协议,也有不太常见的令牌环,还有FDDI,还有国内现在相当普及的PPP协议(就是adsl宽带),以及一个loopback协议。

每一种数据链路层协议,都有一个MTU(最大传输单元)定义,在这个定义下面,如果IP数据报过大,则要进行分片(fragmentation),使得每片都小于MTU,注意PPPMTU并不是一个物理定义,而是指一个逻辑定义。可以用netstat来打印出MTU的结果。

netstat -in

 

IP协议、ARP协议和RARP协议

ARPAddress Resolution Protocol叫做地址解析协议,是用IP地址换MAC地址的一种协议,而RARP则叫做逆地址解析协议。

IP则承载要发送的消息。IP不是可靠的协议,这是说,IP协议没有提供一种数据未传达以后的处理机制--这被认为是上层协议--TCPUDP要做的事情。TCP是一个可靠的协议,UDP不是

IP头部信息: 


头部长度:通常20字节,有选项时更长,总共不超过60字节。 IP数据报长度:65535字节(64KB)。

 

  • 4位版本号:IP协议(IPv4)版本号位4
  • 4位头部长度:标识头部有多少个4字节,即最大共15*4个字节
  • 8位服务类型:包含一个4位优先权字段:最小延时,最大吞吐量,最高可靠性和最小费用。
  • 16位总长度:表示整个IP数据报的长度,最大表示65535,但由于MTU限制,一般无法到达这个值。
  • 16位标识:唯一的标识数据报。系统采用加1的式边发送边赋值。
  • 3位标识(保留,DF禁止分片,MF更多分片):所以这个标志是为分片存在,DF设置时禁止分片所以如果数据报太大则发送失败。MF设置时,如果产生分片,除了最后一个分片,其他此片置1
  • 13位分片偏移:分片相对原始IP数据报开始处的偏移。
  • 8位生存时间(TTL):数据报到达目的地之前允许经过的路由跳跳数。跳一下减1,得0丢弃。
  • 8位协议:用来区分上层协议(ICMP1TCP6UDP17)。
  • 16位头部校验和:仅以CRC算法检验数据报头部在传输过程中是否损坏。
  • 32位源端口IP地址和目的端口地址很明白。
  • 选项(可变长):记录路由,告诉途径得所有路由把IP填进来。 时间戳,告诉每个路由器都将数据报被转发的时间传进来。松散路由选择,指定一个路由器IP地址列表,必须按这个表发送,严格路由选择,数据报经过路由表。

TTL

TTL字段规定该数据包在穿过多少个路由之后才会被抛弃(这里就体现出来IP协议包的不可靠性,它不保证数据被送达),某个ip数据包每穿过一个路由器,该数据包的TTL数值就会减少1,当该数据包的TTL成为零,它就会被自动抛弃。这个字段的最大值也就是255根据系统的不同,这个数字也不一样,一般是32或者是64Tracerouter这个工具就是用这个原理工作的,tranceroute-m选项要求最大值是255,也就是因为这个TTLIP协议里面只有8bit

IP分片

IP在从上层接到数据以后,要根据IP地址来判断从那个接口发送数据(通过选路),并进行MTU的查询,如果数据大小超过MTU就进行数据分片。数据的分片是对上层和下层透明,而数据也只是到达目的地还会被重新组装,不过不用担心,IP层提供了足够的信息进行数据的再组装。

IP头里面,16bit识别号唯一记录了一个IP包的ID,具有同一个IDIP片将会被重新组装;而13位片偏移则记录了某IP片相对整个包的位置;而这两个表示中间的3bit标志则标示着该分片后面是否还有新的分片。这三个标示就组成了IP分片的所有信息,接受方就可以利用这些信息对IP数据进行重新组织

.IP路由选择

路由器或者主机将会用如下的方式来处理某一个IP数据包

  1.   如果IP数据包的TTL(生命周期)以到,则该IP数据包就被抛弃。
  2.   搜索路由表,优先搜索匹配主机,如果能找到和IP地址完全一致的目标主机,则将该包发向目标主机
  3.   搜索路由表,如果匹配主机失败,则匹配同子网的路由器,这需要子网掩码(1.3.)”的协助。如果找到路由器,则将该包发向        路由器。
  4.   搜索路由表,如果匹配同子网路由器失败,则匹配同网号路由器,如果找到路由器,则将该包发向路由器。
  5.   搜索路由表,如果以上都失败了,就搜索默认路由,如果默认路由存在,则发包
  6.   如果都失败了,就丢掉这个包。

子网寻址

IP地址= 网络号码+子网号+主机号。

例如一个B类地址:210.30.109.134。子网掩码255.255.255.0B类地址,因为210.30是网络号,那么后面的109.134就是子网号和主机号的组合,又因为子网掩码只有后八bit0,所以主机号就是IP地址的后八个bit,就是134,而剩下的就是子网号码--109

 

ARP协议

当主机要发送一个IP包的时候,会首先查一下自己的ARP高速缓存(就是一个IP-MAC地址对应表缓存),如果查询的IP-MAC值对不存在,那么主机就向网络发送一个ARP协议广播包,这个广播包里面就有待查询的IP地址,而直接收到这份广播的包的所有主机都会查询自己的IP地址,如果收到广播包的某一个主机发现自己符合条件,那么就准备好一个包含自己的MAC地址的ARP包传送给发送ARP广播的主机,而广播主机拿到ARP包后会更新自己的ARP缓存(就是存放IP-MAC对应表的地方)。发送广播的主机就会用新的ARP缓存数据准备好数据链路层的的数据包发送工作。

arp -a

 

ICMP协议,ping和Traceroute

ICMPInternet Control Message Protocol当传送IP数据包发生错误--比如主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,然后传送回给主机这就是为什么说建立在IP层以上的协议是可能做到安全的原因。ICMP数据包由8bit的错误类型和8bit的代码和16bit的校验和组成。

 

TYPE

CODE

Description

Query

Error

0

0

Echo Reply——回显应答(Ping应答)

x

 

3

0

Network Unreachable——网络不可达

 

x

3

1

Host Unreachable——主机不可达

 

x

3

2

Protocol Unreachable——协议不可达

 

x

3

3

Port Unreachable——端口不可达

 

x

3

4

Fragmentation needed but no frag. bit set——需要进行分片但设置不分片比特

 

x

3

5

Source routing failed——源站选路失败

 

x

3

6

Destination network unknown——目的网络未知

 

x

3

7

Destination host unknown——目的主机未知

 

x

3

8

Source host isolated (obsolete)——源主机被隔离(作废不用)

 

x

3

9

Destination network administratively prohibited——目的网络被强制禁止

 

x

3

10

Destination host administratively prohibited——目的主机被强制禁止

 

x

3

11

Network unreachable for TOS——由于服务类型TOS,网络不可达

 

x

3

12

Host unreachable for TOS——由于服务类型TOS,主机不可达

 

x

3

13

Communication administratively prohibited by filtering——由于过滤,通信被强制禁止

 

x

3

14

Host precedence violation——主机越权

 

x

3

15

Precedence cutoff in effect——优先中止生效

 

x

4

0

Source quench——源端被关闭(基本流控制)

 

 

5

0

Redirect for network——对网络重定向

 

 

5

1

Redirect for host——对主机重定向

 

 

5

2

Redirect for TOS and network——对服务类型和网络重定向

 

 

5

3

Redirect for TOS and host——对服务类型和主机重定向

 

 

8

0

Echo request——回显请求(Ping请求)

x

 

9

0

Router advertisement——路由器通告

 

 

10

0

Route solicitation——路由器请求

 

 

11

0

TTL equals 0 during transit——传输期间生存时间为0

 

x

11

1

TTL equals 0 during reassembly——在数据报组装期间生存时间为0

 

x

12

0

IP header bad (catchall error)——坏的IP首部(包括各种差错)

 

x

12

1

Required options missing——缺少必需的选项

 

x

13

0

Timestamp request (obsolete)——时间戳请求(作废不用)

x

 

14

 

Timestamp reply (obsolete)——时间戳应答(作废不用)

x

 

15

0

Information request (obsolete)——信息请求(作废不用)

x

 

16

0

Information reply (obsolete)——信息应答(作废不用)

x

 

17

0

Address mask request——地址掩码请求

x

 

18

0

Address mask reply——地址掩码应答

 

 

 

为了防止产生ICMP报文的无限传播:

1.         ICMP差错报文不会产生ICMP差错报文(防止IMCP的无限产生和传送)

2.         目的地址是广播地址或多播地址的IP数据报。

3.         作为链路层广播的数据报。

4.         不是IP分片的第一片。

5.         源地址不是单个主机的数据报。这就是说,源地址不能为零地址、环回地址、广播地 址或多播地址。

ICMP协议大致分为两类,一种是查询报文,一种是差错报文。

其中查询报文有以下几种用途:

1.         ping查询

2.         子网掩码查询

3.         时间戳查询(可以用来同步时间)

而差错报文则产生在数据传送发生错误的时候。

ping

ping利用ICMP协议包来侦测另一个主机是否可达。原理是用类型码为0ICMP发请求,受到请求的主机则用类型码为8ICMP回应。ping程序来计算间隔时间,并计算有多少个包被送达。ping还给我们一个看主机到目的主机的路由的机会。这是因为,ICMPping请求数据报在每经过一个路由器的时候,路由器都会把自己的ip放到该数据报中。而目的主机则会把这个ip列表复制到回应icmp数据包中发回给主机。但是ip头所能纪录的路由列表是非常的有限。如果要观察路由, 还是需要使用更好的工具,Traceroute

ICMP的应用—Traceroute

它收到目的主机的IP后,首先给目的主机发送一个TTL=1UDP数据包,而经过的第一个路由器收到这个数据包以后,就自动把TTL1,而TTL变为0以后,路由器就把这个包给抛弃了,并同时产生 一个主机不可达的ICMP数据报给主机。主机收到这个数据报以后再发一个TTL=2UDP数据报给目的主机,然后刺激第二个路由器给主机发ICMP数据 报。如此往复直到到达目的主机。这样,traceroute就拿到了所有的路由器ip。从而避开了ip头只能记录有限路由IP的问题。

有时我们traceroute一台主机时,会看到有一些行是以星号表示的。出现这样的情况,可能是防火墙封掉了ICMP的返回信息,所以我们得不到什么相关的数据包返回数据。

traceroute www.baidu.com

 

网关(Gateway)

网关(Gateway)又称网间连接器、协议转换器。

ICMPIP重定向报文和路由发现报文

IP包在某一个地方转向的时候,都回给发送IP报的源主机一个ICMP重定向报文,而源主机就可以利用这个信息来更新自己的路由表,这样,随着网络通信的逐渐增多,路由表也就越来越完备,数据转发的速度也会越来越快。

动态选路协议是用于动态选路的重要组成部分,但是他们只是使用在路由器之间,相邻路由器之间互相通信。系统(路有选择程序)选择比较合适的路有放到核心路由表中,然后系统就可以根据这个核心路有表找到最合适的网路。也就是说,动态选路是在系统核心网络外部进行的,它只是用一些选路的策略影响路由表,而不会影响到最后通过路由表选择路由的那一部分。

 

UDP协议

UDP协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议。很多软件需要用到UDP协议,所以UDP协议必须通过某个标志用以区分不同的程序所需要的数据包。端口号的功能就在于此,例如某一个UDP程序A在系统中注册了3000端口,那么,以后从外面传进来的目的端口号为3000UDP包都会交给该程序。端口号理论上可以有2^16这么多。因为它的长度是16bit.

UDPARP之间的交互式用

ARP缓存还是空的时候。UDP在被发送之前一定要发送一个ARP请求来获得目的主机的MAC地址,如果这个UDP的数据包足够大,大到IP层一定要对其进行分片.

UDP服务器设计

UDP协议的某些特性将会影响我们的服务器程序设计,大致总结如下:

1.         关于客户IP和地址:服务器必须有根据客户IP地址和端口号判断数据包是否合法的能力。

2.         关于目的地址:服务器必须要有过滤广播地址的能力。

3.         关于数据输入:通常服务器系统的每一个端口号都会和一块输入缓冲区对应,进来的输入根据先来后到的原则等待服务器的处理,所以难免会出现缓冲区溢出的问题,这种情况下,UDP数据包可能会被丢弃,而应用服务器程序本身并不知道这个问题。

4.         服务器应该限制本地IP地址,就是说它应该可以把自己绑定到某一个网络接口的某一个端口上。

广播和多播,IGMP(Internet Group Management Protocol)协议

IGMP的作用在于,让其他所有需要知道自己处于哪个多播组的主机和路由器知道自己的状态。

单播是说,对特定的主机进行数据传送。例如给某一个主机发送IP数据包。这时候,数据链路层给出的数据头里面是非常具体的目的地址,对于以太网来 说,就是网卡的MAC地址(不是FF-FF-FF-FF-FF-FF这样的地址)。现在的具有路由功能的主机应该可以将单播数据定向转发,而目的主机的网 络接口则可以过滤掉和自己MAC地址不一致的数据。

广播和多播的性质是一样的,路由器会把数据放到局域网里面,然后网卡对这些数据进行过滤,只拿到自己打算要的数据,比如自己感兴趣的多播数据,组播数据。当一个主机运行了一个处理某一个多播IP的进程的时候,这个进程会给网卡绑定一个虚拟的多播mac地址,并做出来一个多播 ip。这样,网卡就会让带有这个多播mac地址的数据进来,从而实现通信,而那些没有监听这些数据的主机就会把这些数据过滤掉,换句话说,多播,是让主机 的内核轻松了,而网卡累点。

TCP协议

TCPUDP处在同一层,但是TCP提供了一种可靠的数据传输服务,TCP是面向连接的,也就是说,利用TCP通信的两台主机首先要经历一个拨打电话的过程,等到通信准备结束才开始传输数据,最后结束通话。所以TCP要比UDP可靠的多,UDP是把数据直接发出去,而不管对方是不是在收信,就算是UDP无法送达,也不会产生ICMP差错报文。

TCP保证可靠性的简单工作原理摘抄如下

·            应用数据被分割成TCP认为最适合发送的数据块。这和UDP完全不同,应用程序产生的数据报长度将保持不变。由TCP传递给IP的信息单位称为报文段或段( segment)。

·            TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。

·            TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒。

·            TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输 过程中的任何变化。如果收到段的检验和有差错, 将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。

·            既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要, TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。

·            TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。

 

1-1.源始端口16位,范围当然是0-65535啦。

1-2.目的端口,同上。

2-1.数据序号32位,TCP为发送的每个字节都编一个号码,这里存储当前数据包数据第一个字节的序号。

3-1.确认序号32位,为了安全,TCP告诉接受者希望他下次接到数据包的第一个字节的序号。

4-1.偏移4位,类似IP,表明数据包头有多少个32位。

4-2.保留6位,未使用,应置零。

4-3.紧急比特URG—URG1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)

4-3.确认比特ACK—只有当ACK1时确认号字段才有效。当ACK0时,确认号无效。参考TCP三次握手

4-4.复位比特RST(Reset) —RST1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。参考TCP三次握手

4-5.同步比特SYN—同步比特SYN置为1,就表示这是一个连接请求或连接接受报文。参考TCP三次握手

4-6.终止比特FIN(FINal)—用来释放一个连接。当FIN1时,表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。

4-7.窗口字段16位,窗口字段用来控制对方发送的数据量,单位为字节。TCP连接的一端根据设置的缓存空间大小确定自己的接收窗口

       大小,然后通知对方以确定对方的发送窗口的上限。

5-1.包校验和16位,包括首部数据这两部分。在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。

5-2.紧急指针16位,紧急指针指出在本报文段中的紧急数据的最后一个字节的序号。

6-1.可选选项24位,类似IP,是可选选项。

6-2.填充8位,使选项凑足32位。

7-1.用户数据……

为了建立一个TCP连接,系统可能会建立一个新的进程(最差也是一个线程),来进行数据的传送.

TCP连接的建立与中止

1.连接的建立

在建立连接的时候,客户端首先向服务器申请打开某一个端口,然后服务器端发回一个ACK报文通知客户端请求报文收到,客户端收到确认报文以后再次发出确认报文,确认刚才服务器端发出的确认报文,至此,连接的建立完成。这就叫做三次握手。三次报文.

2.结束连接

TCP有一个特别的概念叫做half-close,是全双工连接,因此在关闭连接的时候,必须关闭传和送两个方向上的连接。客户机给服务器一个FIN1TCP报文,然后服务器返回给客户端一个确认ACK报文,并且发送一个FIN报文,当客户机回复ACK报文后(四次握手),连接就结束了。

掌握本章的状态迁移图才是学习本章的关键。

三次握手:

LISTEN:表示服务器的某个SOCKET处于监听状态,可以进行连接了。

SYN_SENT:表示客户端的某个SOCKET与服务器进行connect时,首先发送SYN报文,然后进入SYN_SENT状态,等待服务器发送ACK+SYN报文。

SYN_RECV:表示服务器收到客户端发送的SYN报文,然后向客户端发送SYN+ACK报文,随后服务器进入SYN_RECV状态。

ESTABLISHED:表示连接已经建立,当客户端在SYN_SENT状态时,收到服务器发送的ACK+SYN报文之后,然后进行第三次握手,客户端发送ACK报文,然后进入ESTABLISHED状态,当处于SYN_RECV状态的服务器收到客户端发送的ACK报文之后,也进入ESTABLISHED状态,然后连接建立。

四次挥手:

FIN_WAIT_1:表示客户端SOCKET想主动关闭连接,于是向服务器发送FIN报文,然后进入FIN_WAIT_1状态。

FIN_WAIT_2:表示客户端收到服务器发来的ACK报文,此时客户端进入FIN_WAIT_2状态,此时客户端这边的连接已经关闭,但服务器端的连接还没关闭,也就是服务器还可以继续向客户端发送数据。

CLOSING:这种状态表示此时双方刚好可能都在关闭连接,即客户端向服务器发送FIN报文,进入FIN_WAIT_1状态后,没有收到服务器发来的ACK报文,反而受到服务器发来的FIN报文,说明此时客户端和服务器同时发起关闭连接,随后,客户端进入CLOSING状态。

TIME_WAIT:表示收到了服务器发来的FIN报文,然后客户端发送ACK报文,随后进入TIME_WAIT状态,等待2MSL之后进入CLOSED状态。

CLOSE_WAIT:表示当服务器收到客户端发来的FIN报文之后,发送ACK报文,随后服务器进入CLOSE_WAIT状态。

LAST_ACK:表示服务器主动关闭连接,向客户端发送FIN报文后,随即进入LAST_ACK状态,如果收到了客户端发来的ACK报文之后,就进入CLOSED状态。

需要解释的是为何TIME_WAIT需要等2MSL时间才能回到CLOSED状态:

如果网络不可靠,那么就无法保证最后客户端发送的ACK报文服务器端一定能够收到,因此处于LAST_ACK状态的服务器可能会因为超时而未收到ACK报文,而重新向客户端发送FIN报文,TIME_WAIT的作用就是用来客户端重新发送可能丢失的ACK报文。

目前建立在TCP协议上的网络协议特别多,有telnetssh,有ftp,有http等等。这些协议又可以根据数据吞吐量来大致分成两大类:(1)交互数据类型,例如telnetssh,这种类型的协议在大多数情况下只是做小流量的数据交换,比如说按一下键盘,回显一些文字等等。(2)数据成块类型,例如ftp,这种类型的协议要求TCP能尽量的运载数据,把数据的吞吐量做到最大,并尽可能的提高效率。针对这两种情况,TCP给出了两种不同的策略来进行数据传输。

TCP服务器设计

TCP服务器对于每一个连接都需要建立一个独立的进程(或者是轻量级线程),来保证对话的独立性。所以TCP服务器是并发的。而且TCP还需要配备一个呼入连接请求队列(UDP服务器也同样不需要),来为每一个连接请求建立对话进程,这也就是为什么各种TCP服务器都有一个最大连接数的原因。而根据源主机的IP和端口号码,服务器可以很轻松的区别出不同的会话,来进行数据的分发。

DNS域名系统

DNS系统是一个分布式的数据库,当一个数据库发现自己并没有某查询所需要的数据的时候,它将把查询转发出去,而转发的目的地通常是根服务器,根服 务器从上至下层层转发查询,直到找到目标为止。DNS还有一个特点就是使用高速缓存,DNS把查询过的数据缓存在某处,以便于下次查询时使用。

host命令,host ip就可以得到服务器的域名,host domainName 就得到IP。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值