项目日报开发表第十天

项目日报开发表
项目名称苏嵌实训—嵌入式LinuxC第十天
今日进度以及任务Linux网络结构等知识 
本日任务完成情况

应用层(application layer)

应用层是体系结构中的最高层。应用层的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程间通信和交互的规则。这里的进程就是主机中正在运行的程序。对于不听的网络应用需要不有不同的应用层协议。在互联网的应用层协议很多,如域名DNS,支持万维网应用的HTTP协议,支持电子邮件的SMTP协议,等等。我们把应用层的数据单元称为报文(messgae)。

运输层(transport layer)

运输层的任务就是负责向两台主机中进程之间的通信提供通用的数据传输服务。应用进程利用该服务穿上那个应用层报文。所谓通用的,是指并不针对某个特定网路应用,而是多种应用可以使用同一个运输层服务。由于一台主机可以同时运行多个进程,因此运输层有复用和分用的功能。复用就是多个应用层进程可同时使用下面运输层的服务,分用和复用相反,是运输层把收到的信息分别交付给上面应用层的相关进程。

运输层主要有下面两种协议:

传输控制协议TCP(Transmission Control Protocol)-提供面向连接的、可靠的数据传输服务,其数据传输的单位是报文段(segment)。

用户数据报协议 UDP(User Datagram)。 Protocol)-提供无连接的、尽最大努力(best-effort)的数据传输服务(不保证数据传输的可靠性),其数据传输的单位是用户数据报。

顺便指出,有人原意把运输层称为传输层,理由是这一层使用的TCP协议就叫做传输控制协议。从意思上看,传输和运输差别也不大,但OSI定义的第四层使用的是Transport,而不是Transmission。这两个字的含义还是有些差别。因此,使用运输层这个译名比较准确。

网络层(network layer)

网络层负责为分组交换网上的不同主机提供通信服务。
在发送数据时,网络层吧运输层产生的报文段或者用户数据报封装成分组或者包进行传送。在TCP/IP体系中,由于网络层使用IP协议,因此分组也叫作IP数据报,或简称数据报。
请注意:不要将运输层的"用户数据报UDP"和网络层的"IP数据报"弄混,此外,无论哪一层传输的数据单元,都可以笼统的用"分组"来表示。
网络层的另一个任务就是选择合适的路由,是源主机运输层所传下来的分组,能够通过网络中的路由器来找到目的主机。

互联网是有大量的异构(heterogeneous)网络来通过路由器(Router)相互连接起来的。互联网使用的网络层协议是无连接的网际协议IP(Internet Protocol)和许多路由选择协议, 因此互联网的网络层也叫作网际层或IP层。

数据链路层(data link layer)

数据链路层通常简称为链路层。我们知道,两台主机之间的数据传输,总是在一段一段的链路上传送的, 这就需要使用专门的链路层的协议。在两个相邻结点之间传送数据时,数据链路层量网络层交下来的IP数据报封装成帧(frameing),在两个相邻节点间的链路上传送帧, 每一帧包括数据和必要的控制信息(如同步信息、地址信息、差错信息等)。

在接收数据时,控制信息使接收端能够知道一个帧从哪个比特开始到哪个比特结束,这样数据链路层在收到一个帧后,就可从中提取数据部分,上交到网络层。

控制信息还能使接收端能够检测到所收到的帧中有无差错。如发现有差错,数据链路层就简单的丢弃了这个出了差错的帧,以免继续在网络传输下去白白的浪费资源。如果需要改正数据在数据链路层传输时出现的差错(这就是说,数据链路层不仅要检错,还要纠错), 那么就可以采用可靠数据传输协议来纠正出现的差错。这种方法会使数据链路层的协议复杂些。

物理层(physical layer)

在物理层上所传数据的单位是比特(bit)。发送方发送1或者0时,接收方应该接收相同的1或者0,因此物理层要考虑用多大的电压代表"1"或者"0", 以及接收方如何识别发送方所发出的比特。物理层还要确定连接电缆的插头应当有多少根引脚以及各引脚如何连接。当然解释比特代表的意思,就不是物理层的任务。请注意,传递信息所利用的一些物理媒体,如双绞线、同轴电缆、光缆、无线信道等,并不是物理层协议之内而是在物理层协议的下面。因此也有人把物理层当做第0层。

在互联网所使用的的各种协议中,最重要的和最著名的就是TCP和IP两个协议。现在人们经常提到的TCP/IP并不一定是单指TCP和IP两个具体的协议,而往往是表示互联网所使用的的整个TCP/IP协议族(Protocol suite)

本日开发中出现的问题汇总ip地址连接失败
本日未解决问题socket 编程完成服务器和客户端之间的通信
本日开发收获 
其他 

作业
server.c

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <string.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>

#define PORT 33333

int main()
{
    int servfd;
    int cliefd;

    int opt;
    int cl_len;

    char buff[1024];
    
    struct sockaddr_in servaddr;
    struct sockaddr_in clieaddr;

    servfd = socket(AF_INET, SOCK_STREAM, 0);
    if(servfd == -1)
    {
        perror("socket error:");
        exit(1);
    }

    printf("socket success!\n");

    bzero(&servaddr, sizeof(struct sockaddr_in));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(PORT);
    servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");

    opt = 1;
    setsockopt(servfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

    if(bind(servfd, (struct sockaddr *)(&servaddr), sizeof(struct sockaddr_in)) < 0)
    {
        perror("bind error:");
        exit(1);
    }

    printf("bind success!\n");

    if(listen(servfd, 3) < 0)
    {
        perror("listen error:");
        exit(1);
    }

    printf("listen success!\n");

    while(1){

        memset(buff, 0, sizeof(buff));

        bzero(&clieaddr, sizeof(struct sockaddr_in));
        cl_len = sizeof(struct sockaddr_in);

        printf("accepting ........ \n");

        cliefd = accept(servfd, (struct sockaddr *)(&clieaddr), &cl_len);
        if(cliefd == -1)
        {
            perror("accept error:");
            exit(1);
        }

        printf("ip: %s  port: %d\n", inet_ntoa(clieaddr.sin_addr), ntohs(clieaddr.sin_port));

        read(cliefd, buff, sizeof(buff));

        printf("recv = %s\n", buff);

        usleep(2);

        write(cliefd, buff, strlen(buff));
    }

    return 0;
}

 


client.c

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <string.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>

#define PORT 33333

int main()
{
    int cliefd;

    char buff[1024];

    struct sockaddr_in servaddr;

    cliefd = socket(AF_INET, SOCK_STREAM, 0);
    if(cliefd == -1)
    {
        perror("socket error:");
        exit(1);
    }

    printf("socket success!\n");

    bzero(&servaddr, sizeof(struct sockaddr_in));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(PORT);
    servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");

    if(connect(cliefd, (struct sockaddr *)(&servaddr), sizeof(struct sockaddr_in)) < 0)
    {
        perror("connection error:");
        exit(1);
    }

    printf("connect success!\n");

    write(cliefd, "hello world!", 13);

    memset(buff, 0, sizeof(buff));

    read(cliefd, buff, sizeof(buff));

    printf("recv = %s\n", buff);

    return 0;
}

运行结果:

[vic@localhost note]$ ./server 
socket success!
bind success!
listen success!
accepting ........ 
ip: 127.0.0.1  port: 46084
recv = hello world!
accepting ........ 
ip: 127.0.0.1  port: 46086
recv = hello world!
accepting ........ 
ip: 127.0.0.1  port: 46088
recv = hello world!
accepting ........ 
ip: 127.0.0.1  port: 46090
recv = hello world!
accepting ........ 


[vic@localhost note]$ ./client 
socket success!
connect success!
recv = hello world!
[vic@localhost note]$ ./client 
socket success!
connect success!
recv = hello world!
[vic@localhost note]$ ./client 
socket success!
connect success!
recv = hello world!
[vic@localhost note]$ ./client 
socket success!
connect success!
recv = hello world!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值