TCP/IP协议

发布 : 2019-04-19 分类 : 网络 浏览 :

目的

让大家了解TCP/IP的基本概念和一些原理,在实际运用中知道具体问题所在。同时在面试的时候,也不至于被面试官鄙视。

分层

  • 链路层:数据链路层或者网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。
  • 网络层:包括IP协议,ICMP协议,及IGMP协议。
  • 传输层:主要为两台主机上的应用程序提供端到端的通信。包括TCP协议(传输控制协议)和UDP协议(用户数据报协议)。
  • 应用层:处理特定应用程序细节,包括如下:
    • telnet远程登陆
    • ftp文件传输协议。
    • smtp简单邮件传输协议。
    • snmp简单网络管理协议。

tcp和udp都使用IP作为网络层协议。

虽然tcp使用的是不可靠的IP服务,但是它却提供了一种可靠的传输层服务。与tcp不同的是udp,它是不可靠的,他不能保证数据报能安全无误的到达最终目的地。

ICMP是IP协议的附属协议,IP层用它来与其他主机或者路由器交换错误报文或者其他重要信息。

TGMP是Internet组管理协议。它用来把一个UDP数据报多播到多个主机。

ARP(地址解析)和RARP(逆地址解析)是某些网络接口使用的特殊协议。用来转换IP层和网络接口层使用的地址。

IP网际协议

IP是TCP/IP协议族中最为核心的协议。

不可靠(unreliable)的意思是她不能保证IP数据报能成功到达目的地。IP仅提供最好的传输服务。如果发狠错误的时候,IP简单的处理方式:丢弃该报文数据,然后发送一个ICMP 报文给信源端。任何可靠的服务必须由上层来提供,如TCP。

无连接(connectionless)意思是IP并不维护任何关于后续数据报的状态信息。每个数据都是相互独立的,这也说明,对于IP数据报的接收也并非按照发送的顺序的。

  • IP首部

    默认IP首部为20个字节。20个字节包含的具体如上图,其中32位的源和目的IP地址也在其中。

  • IP数据报最长可以达65535直接,虽然可以传送一个65535字节的IP数据报,但是大多数链路层都会对他进行分片,而且主机要求不能接受超过576字节的数据包。

  • IP路由选择
    当IP数据报从上层发过来以后,就搜索路由表,发现目的IP地址。
    如果当前IP地址不在同一个网络,那么就发往当前的路由器地址,路由器地址收到报文请求后,再搜索路由表,看下一跳地址,如果找不到,那么就发往默认的下一跳的路由表。如此进行。所以IP地址的转发是hop-to-hop的,也就是说逐跳进行的。

  • 子网寻址
    所有的主机都要支持子网编址。不是把IP地址单纯的划分成网络号和主机号,而是把主机号再划分成子网号和主机号。

  • 子网掩码
    除了IP地址以外,主机还需要知道有多少Bit是用于子网号,及多少用于主机号。这个就是通过子网掩码来确定的。这个掩码是一个32bit的值,其中值为1 的bit留给网络和子网号,为0的留给主机号。

TCP传输控制协议

TCP建立IP层之上,提供面向连接的,可靠的直接流服务。

面向连接意味着tcp双方首先要建立一个连接。其次在此连接之上进行通信。

tcp提供可靠性的方法:
1、分块:应用数据被分块传输,分割成tcp认为最适合发送的数据块。
2、重发:tcp发出一个报文后,会启动一个定时器,等待目的段回复是否收到,如果没有收到,将启动重发机制。
3、应答:当TCP一端收到另外一端的TCP数据报后,将会发送一个确认,这个确认不是立即发送,而是推迟几分之一秒。
4、校验:TCP将保持它首部和数据的校验和,这是一个端到端的校验和,目的是检测数据在传输过程中的任何变化。如果有差错,将丢弃这个报文段不进行确认收到。
5、去重:tcp接收端会丢弃掉重复的数据。
6、流控:tcp连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另外一端发送接收端缓冲区所能容纳的数据。

  • TCP首部
    TCP被封装在一个IP报文内。

TCP 首部是16位的源端口号和16位的目的端口号

tcp提供全双工的服务,这意味着数据能在两个方向上独立的进行传输。在tcp首部中有6个标志的bit:
1、URG:紧急指针
2、ACK:确认序号有效。
3、PSH:接收方应该尽快将这个报文交给应用层。
4、RST:重建连接。
5、SYN:同步序号用来发起一个连接。
6、FIN:发端完成发送任务。

TCP建立与终止

  • 我们可以采用tcpdump来观察在建立tcp连接的时候,究竟发生了什么:
    Tcpdump tcp port xx可以监控报文的通讯情况。


1、请求端发送一个SYN段指明客户打算连接到服务器端口,以及一个初始的ISN序号,这里是14155311521,报文段1.
2、服务端发挥包含服务器的的初始序号SYN报文作为应答。同时将确认需要设置成客户的ISN+1对客户的SYN进行回复确认。一个SYN占用一个序号。
3、客户必须将确认序号设置成服务器的ISN+1对服务器SYN报文进行回复确认。
通过这三个报文完成连接的建立。也称为3次握手

  • 连接的终止
    终止一个连接需要经过4次握手,这个是由于TCP的半关闭造成的。因为TCP是全双工的,因此每个端都需要单独进行关闭。原则就是当一方完成数据的发送后,就发送一个FIN来终止这个方向的连接。当另外一端收到这个FIN后,他必须通知应用层另一端已经终止了那个方向的数据传送。

收到一个FIN后只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。

2MSL等待状态

TIME_WAIT状态也称为2MSL状态。
2MSL(maxsmum segment lifetime)报文段最大生存时间。
TCP报文段以IP报文数据在网络内传输,而IP数据则有限制其生存时间的TTL字段。
RFC 793[Postel 1981c] 指出MSL为2分钟。实现中的常用值是30秒,一分钟或者两分钟。

对于一个具体给定的MSL值,处理的原则是:当TCP执行一个主动关闭,并发回最后一个ACK,该链接必须在TIME——WAIT状态停留的时间为2倍的MSL。这样可以让TCP再次发送最后的ACI以防止这个ACK丢失(另一端超时并重发最后的FIN)。

这种2MSL的等待另一个结果是这个tcp连接在2MSL等待时间,定义这个连接的插口不能再被使用。这个连接只能在2MSL结束后才能再被使用。

CLOSE_WAIT概念
CLOSE_WAIT是被动关闭连接是形成的。根据TCP状态机,服务器端收到客户端发送的FIN,则按照TCP实现发送ACK,因此进入CLOSE_WAIT状态。但如果服务器端不执行close(),就不能由CLOSE_WAIT迁移到LAST_ACK,则系统中会存在很多CLOSE_WAIT状态的连接。此时,可能是系统忙于处理读、写操作,而未将已收到FIN的连接,进行close。此时,recv/read已收到FIN的连接socket,会返回0。

工具的使用

netstat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-a 列出所有链接

 -t 选项列出 TCP 协议的连接
-u 选项列出 UDP 协议的连接
-n 选项禁用域名解析功能
-l 选项列出正在监听的套接字 注意:不要使用 -a 选项,否则 netstat 会列出所有连接,而不仅仅是监听端口。
-p 选项查看进程信息
-ep 选项可以同时查看进程名和用户名
-c 选项持续输出信息
-g 会输出 IPv4 和 IPv6 的多播组信息

netstat -atnp | grep ESTA :active 状态的套接字连接用 "ESTABLISHED" 字段表示,所以我们可以使用 grep 命令获得 active 状态的连接
配合 watch 命令监视 active 状态的连接:
watch -d -n0 "netstat -atnp | grep ESTA"
-n # 或--interval watch缺省每2秒运行一下程序,可以用-n或-interval来指定间隔的时间。
-d # 或--differences 用-d或--differences 选项watch 会高亮显示变化的区域。 而-d=cumulative选项会把变动过的地方(不管最近的那次有没有变动)都高亮显示出来。
-t # 或-no-title 会关闭watch命令在顶部的时间间隔,命令,当前时间的输出。
-h, --help # 查看帮助文档

lsof

lsof -nP -iTCP:端口号 -sTCP:LISTEN

本文作者 : braveheart
原文链接 : https://zhangjun075.github.io/passages/tcpip协议/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

知识 & 情怀 | 二者兼得

微信扫一扫, 向我打赏

微信扫一扫, 向我打赏

支付宝扫一扫, 向我打赏

支付宝扫一扫, 向我打赏

留下足迹