您的位置:首页 > 理论基础 > 计算机网络

嵌入式开发第33天:(TCP/IP协议,面试题内容之一)

2016-08-24 00:02 225 查看

1.TCP/IP协议的历史

1974年12月两人正式发表第一份TCP协议详细说明,但此协议在有数据包丢失时不能有效的纠正。


2.TCP/IP的概念

TCP/IP协议分成了两个不同的协议:

.用来检测网络传输中差错的传输控制协议TCP

.专门负责对不同网络进行互联的互联网协议IP

TCP/IP协议名称

传输控制/网际协议(Transfer Control Protocol/Internet Protocol) 又称作网络通讯协议。

3.TCP/IP协议分为4层

.应用层
Telnet、HTTP、FTP等。
.传输层 TCP,UDP(单播、组播、广播)
.网络层 IP、ICMP、IGMP
.网络接口与物理层
网卡驱动、物理硬件(DM9000)



4.TCP与UDP的概念

1.TCP(即传输控制协议:Transfer Control Protocol)

是一种面向连接的传输层协议,它能提供高可靠性通信(即数据无误、数据无丢失、数据无失序、数据无重复到达的通信)

2.TCP使用情况

适合于对传输质量要求较高,以及传输大量数据的通信。 传输文件:迅雷,飞秋

在需要可靠数据传输的场合,通常使用TCP协议 网银

MSN/QQ等即时通讯软件的用户登录账户管理相关的功能通常采用TCP协议 QQ、微信、LOL等

3.UDP(Us
4000
er Datagram Protocol)用户数据报协议

是不可靠的无连接的协议。在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输。

4.UDP适用情况:

适合于广播/组播式通信中。 //电子教室、视频直播、安防监控

MSN/QQ/Skype等即时通讯软件的点对点文本通讯以及音视频通讯通常采用UDP协议
//文字聊天、音视频传输

流媒体、VOD、VoIP、IPTV等网络多媒体服务中通常采用UDP方式进行实时数据传输//优酷、乐视、腾讯视频

在网络视频的一个帧率是30fps,超过24FPS ,人眼是注意不到的,在udp就算出现丢帧的现象也很难发现。

但对早期的高动态电子游戏,尤其是射击游戏或竞速游戏来说,帧率少于每秒30帧的话,

游戏就会显得不连贯,这是因为电脑会准确地显示瞬时的画面(像是一台快门速度无限大的相机),

没有动态模糊使流畅度降低。

5.网络编程预备知识

1.Socket

A.简介
Socket
是一个编程接口
是一种特殊的文件描述符 
(everything in Unix is a file)
并不仅限于TCP/IP协议
面向连接
(Transmission Control Protocol - TCP/IP)

无连接 (User Datagram Protocol -UDP 和 Inter-network Packet Exchange - IPX)

B.类型

1)流式套接字(SOCK_STREAM)
提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制

2)数据报套接字(SOCK_DGRAM)
提供无连接服务。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收。

3)原始套接字(SOCK_RAW)

可以对较低层次协议如IP、ICMP直接访问。

2.IP地址

A.简介
IP地址是Internet中主机的标识。
Internet中的主机要与别的机器通信必须具有一个IP地址,而且是不能相同,若相同,就出现IP地址冲突。
IP地址为32位(IPv4)或者128位(IPv6)
每个数据包都必须携带目的IP地址和源IP地址
目的IP:对方的IP地址
源IP:自己的IP地址

B.表达方式
常用点分形式:192.168.1.3 ------->转换为32位无符号整型数据

C.分类
分为四类:A类、B类、C类、D类(组播/多播地址)。

1)A类地址
0开头,只用第一个字节的后7位表示网络,后3个字节表示主机。
0.0.0.1~127.255.255.254

2)B类地址
10开头,只用14位表示网络,后2个字节表示主机
128.0.0.0~191.255.255.254

3)C类地址
110开头,用21位表示网络,1个字节表示主机
192.0.0.0~223.255.255.254
4)D类地址
1110开头,用28位组播地址

224.0.0.0~239.255.255.254

5)特殊地址
0.0.0.0
默认指本网络,可以接收单播、组播、广播的网络数据。
127.0.0.1
默认作为本地环路地址(测试),不需要对方主机,做一个自发自收的实验。

主机值为255
默认向所有主机(电脑)发送数据
3.端口号
不同的端口用于不同的服务程序。
HTTP——80 
FTP——21  
TELNET——23 
SMTP ——25 
DNS——53 
TFTP——69 
SNMP——161 
RIP——520
.......

众所周知端口:1~1023(1~255之间为众所周知端口,256~1023端口通常由UNIX系统占用)

注册端口:1024~49150

动态或私有端口:49151~65535

4.字节序

A.不同类型CPU的主机中,内存存储多字节整数序列有两种方法,称为主机字节序(HBO).
.在不同的CPU有所区别
.16/32/64位数据

B.分类
1)小端字节序
.CPU:Intel/AMD--x86平台,ARM,AVR
.usb
.低序字节存储在低地址,高字节存储高地址

2)大端字节序
.CPU:8051、Motrola
.网络
//由于网络都是大端序 所以本地发送的时候 都要转换
.低序字节存储在高地址,高字节存储低地址

C.转换函数

1)主机字节(排)序到网络字节(排)序

.u_long htonl (u_long hostlong)
将主机的32位无符号整型数据转换为网络32位无符号整型数据

int a=0x12345678;
int b=0;
b = htonl(a);

得到结果b=0x78563412.

.u_short htons (u_short short)
将主机的16位无符号整型数据转换为网络16位无符号整型数据

int a=0x1234;
int b=0;
b = htonl(a);

得到结果b=0x3412.

2)网络字节序到主机字节序
.u_long ntohl (u_long hostlong);
将网络的32位无符号整型数据转换为主机32位无符号整型数据

int a=0x12345678;
int b=0;
b = ntohl (a);

得到结果b=0x78563412.
.u_short ntohs (u_short short)
将网络的16位无符号整型数据转换为主机16位无符号整型数据

int a=0x1234;
int b=0;
b = ntohs (a);

得到结果b=0x3412.

五、TCP程序编写
.在ubuntu当中,可以使用man命令查找这些函数的使用方法。

1.客户端

A.创建套接字,创建一个通信端口

socket - create an endpoint for communication

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>

int socket(int domain, int type, int protocol);
参数:
domain

.指定使用的协议
.IPv4
AF_INET
type
.指定套接字类型
.TCP
SOCK_STREAM
.UDP
SOCK_DRGAM

protocol
.默认值为0,使用标准的协议

返回值:
成功
返回一个文件描述符
失败
-1,并且设置错误信息。

B.连接服务器

NAME
       connect - initiate a connection on a socket

SYNOPSIS

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>

int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);

参数:
sockfd
套接字的文件描述符

addr
通用的地址结构,往往先使用sockaddr_in进行设置,然后进行强制转换。

addrlen
sockaddr结构体的大小

返回值:
RETURN VALUE
       If  the connection or binding succeeds, zero is returned.  On error, -1
       is returned, and errno is set appropriately.

C.发送数据
NAME
       send, sendto, sendmsg - send a message on a socket

SYNOPSIS
       #include <sys/types.h>
       #include <sys/socket.h>

       ssize_t send(int sockfd, const void *buf, size_t len, int flags);
参数:
sockfd
socket返回的文件描述符
buf
发送缓冲区首地址
len
发送的字节数

flags
0

RETURN VALUE
       On  success,  these  calls  return  the  number of characters sent.  On
       error, -1 is returned, and errno is set appropriately.

D.接收数据

NAME
       recv - receive a message from a socket

SYNOPSIS
       #include <sys/types.h>
       #include <sys/socket.h>

       ssize_t recv(int sockfd, void *buf, size_t len, int flags);
参数:
sockfd
socket返回的文件描述符
buf
接收缓冲区首地址
len
接收的字节数

flags
0

RETURN VALUE
       These  calls  return  the  number  of bytes received, or -1 if an error
       occurred.  The return value will be 0 when the peer  has  performed  an
       orderly shutdown.

E.关闭套接字
close

2.服务器端

A.创建套接字,创建一个通信端口

socket - create an endpoint for communication

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>

int socket(int domain, int type, int protocol);
参数:
domain

.指定使用的协议
.IPv4
AF_INET
type
.指定套接字类型
.TCP
SOCK_STREAM
.UDP
SOCK_DRGAM

protocol
.默认值为0,使用标准的协议

返回值:
成功
返回一个文件描述符
失败
-1,并且设置错误信息。
B.绑定IP地址与端口

NAME
       bind - bind a name to a socket

SYNOPSIS
       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

       int bind(int sockfd, const struct sockaddr *addr,
                socklen_t addrlen);

RETURN VALUE
       On  success,  zero is returned.  On error, -1 is returned, and errno is
       set appropriately.

C.监听限制当前的连接数

NAME
       listen - listen for connections on a socket

SYNOPSIS
       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

       int listen(int sockfd, int backlog);

RETURN VALUE
       On  success,  zero is returned.  On error, -1 is returned, and errno is
       set appropriately.

D.接受连接

int?accept(int?sockfd,?struct?sockaddr?*addr,                                  

            socklen_t?*addrlen) ;

返回值:已建立好连接的套接字或-1
头文件

#include <sys/types.h>

#include <sys/socket.h>? 

sockfd : 监听套接字 

addr : 对方地址

addrlen:地址长度
                                 

E.发送/接收
send recv

F.关闭套接字
close

3.特殊函数的使用方法

A.将字符串的IP地址转换为32位整型IPv4地址

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
in_addr_t inet_addr(const char *cp);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: