第五章运输层
**第五章: 运输层**
在计算机网络中,运输层(Transport Layer)是OSI参考模型中的第四层。它负责将数据从源主机传递到目的主机,并确保数据的正确传递。在这一章,我们将深入探讨运输层的功能、协议和实现。
**5.1 运输层的功能**
运输层的主要功能是提供一个端到端的数据传输服务。它负责将数据从源主机传递到目的主机,并确保数据的正确传递。在这一过程中,运输层需要解决以下几个问题:
* **连接管理**:建立和终止连接。
* **差错检测**:检查数据是否有错误或丢失。
* **流量控制**:限制发送方的数据速率。
* **拥塞避免**:预防网络拥塞。
**5.2 TCP协议**
TCP(Transmission Control Protocol)是最常用的运输层协议之一。它提供了一个可靠的、连接式的服务,确保数据在传递过程中不被丢失或损坏。TCP使用序列号和确认号来实现这一点。
**5.2.1 TCP连接建立**
当两个主机之间需要建立一个TCP连接时,会发生以下过程:
* **SYN**:源主机发送一个 SYN包(同步包),包含其初始序列号。
* **SYN-ACK**:目的主机收到 SYN包后,返回一个 SYN-ACK包,包含其初始序列号和确认号。
* **ACK**:源主机收到 SYN-ACK包后,发送一个 ACK包,确认连接建立。
**5.2.2 TCP数据传输**
当TCP连接建立后,源主机可以开始发送数据。每个数据包都包含一个序列号和确认号,以便接收方能够正确重组数据。
* **SEQ**:源主机发送一个数据包,包含其当前序列号。
* **ACK**:目的主机收到数据包后,返回一个 ACK包,确认接收并更新其确认号。
**5.2.3 TCP连接终止**
当TCP连接需要被终止时,会发生以下过程:
* **FIN**:源主机发送一个 FIN包(结束包),表示连接将要关闭。
* **ACK**:目的主机收到 FIN包后,返回一个 ACK包,确认接收并更新其确认号。
**5.3 UDP协议**
UDP(User Datagram Protocol)是另一种常用的运输层协议。它提供了一个不可靠的、连接式的服务,不保证数据在传递过程中不被丢失或损坏。
**5.4 运输层实现**
运输层的实现通常由操作系统负责。在Linux系统中,运输层协议由内核模块实现。用户空间应用程序可以使用库函数来访问这些模块。
* **socket**:创建一个 socket 对象,用于数据传输。
* **bind**:绑定 socket 到一个地址和端口上。
* **listen**:开始监听 socket 的连接请求。
* **accept**:接受一个连接请求,并返回一个新的 socket 对象。
* **send**:发送数据通过 socket。
* **recv**:接收数据通过 socket。
**5.5代码示例**
以下是使用TCP和UDP协议的代码示例:
c#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #define PORT8080int main() { int sockfd, connfd; struct sockaddr_in servaddr, cliaddr; // 创建 socket 对象 sockfd = socket(AF_INET, SOCK_STREAM,0); if (sockfd < 0) { perror("socket"); exit(1); } // 绑定 socket 到一个地址和端口上 memset(&servaddr,0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(PORT); inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr); // 开始监听 socket 的连接请求 if (bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) { perror("bind"); exit(1); } // 开始监听 socket 的连接请求 listen(sockfd,3); while (1) { // 接受一个连接请求,并返回一个新的 socket 对象 connfd = accept(sockfd, (struct sockaddr *)&cliaddr, NULL); if (connfd < 0) { perror("accept"); continue; } char buffer[256]; int n = read(connfd, buffer,255); if (n >0) { printf("%s ", buffer); } } return0; }
c#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #define PORT8080int main() { int sockfd, connfd; struct sockaddr_in servaddr, cliaddr; // 创建 socket 对象 sockfd = socket(AF_INET, SOCK_DGRAM,0); if (sockfd < 0) { perror("socket"); exit(1); } // 绑定 socket 到一个地址和端口上 memset(&servaddr,0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(PORT); inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr); // 发送数据通过 socket char buffer[] = "Hello, world!"; sendto(sockfd, buffer, strlen(buffer),0, (struct sockaddr *)&servaddr, sizeof(servaddr)); return0; }
以上是运输层的基本内容。运输层协议提供了一个端到端的数据传输服务,确保数据在传递过程中不被丢失或损坏。在这一章,我们深入探讨了TCP和UDP协议的功能、实现和代码示例。