Open ivan-94 opened 6 years ago
应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation). 数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理
不同协议层对数据包有不同的称谓:
TCP的输出过程:
常见的因特网协议使用:
端口号(port number)被TCP、UDP、SCTP这三种协议用来区分服务进程。也就是说发起一个传输层协议连接必须指定 host + port 才能指定一个服务进程。端口号为16位的整数
TCP和UDP可以复用同一个端口. 比如DNS就同时支持UDP和TCP请求
标识每个端点的两个值(IP+port)通常称为一个套接字。而标记一个连接,则需要两个套接字,分别为本地套接字和远程套接字。
UDP 是一个简单的传输层协议。 特点:
特点:
缺点:用时间和空间来换取可靠性。适合发送大量数据或可靠连接的场景
半关闭: 在步骤 2,3 之间,“被动关闭一端”到“主动关闭一端”还是可以发送数据的, 这被称为半关闭。 通过 shutdown 方法进行操作
应用程序意外退出,或套接字文件描述符被关闭,也会导致 TCP 发出一个 FIN。
注意上图,服务器对客户端请求的确认是伴随应答发送的,这个做法称谓捎带(piggybacking), 通常在服务器处理请求并产生应答的时间小于200ms时发生。如果长于这个时间,将先发送确认后再发送应答
执行主动关闭的那一端,将在这个状态上停留持续 2MSL 时间(MSL, maximum segment lifetime, 最长分节生命周期)。MSL 的建议值是 2 分钟,实际上根据不同的实现,这个值在 1-4 分钟之间。为什么需要这个状态停留 4 分钟?
“迷途的重复分组(lost duplicate)或漫游的重复分组(wandering duplicate)"
可以假设 MSL 是任何 IP 数据报能够在因特网中存活的最长时间,分组可能会在网络中迷失,比如路由异常了,在迷途期间,发送端 TCP 超时并重传改分组,而重传的分组却通过某条候选路径到达最终目的地。早先迷失的分组也会最终也被送到目的地。这个原来的分组称为迷途的重复分组(lost duplicate)或漫游的重复分组(wandering duplicate)。
在一个连接关闭之后, 过一段时间后再相同的IP和端口之间建立另一个连接。后一个连接称为前一个连接的化身(incarnation),因为他们IP地址和端口号相同,如果没有TIME_WAIT 状态, 新的连接可能接收到迷失的分组。通过TIME_WAIT状态,足以让这些迷失分组被丢弃。
一个连接有11中状态:
协议栈
上图表示的是理论的网络协议分层OSI(open systems interconnection)和实际使用的TCP/IP之间的映射。 顶上三层处理具体网络应用(如FTP, HTTP)的所有细节, 对通信的细节了解很少;底下四层对具体网络应用了解不多,负责处理所有通信细节:发送数据,等待确认,给无序到达的数据排序, 计算校验和等等。 通过分层的结构,划分职责,隔离复杂度。 顶上三层对应的是用户进程, 而底下四层则作为操作系统的一部分提供。