嵌入式开发第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.SocketA.简介
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);
相关文章推荐
- C语言面试题(嵌入式开发方向,附答案及点评)
- 深入理解嵌入式开发的学习内容
- 嵌入式开发需要学习和掌握哪些知识内容?
- 嵌入式软件开发经典面试题
- 嵌入式开发.C语言面试题
- 百度内容质量部测试开发面试题
- C/C++嵌入式开发面试题
- 嵌入式开发之命令行---linux下的find文件查找命令与grep文件内容查找命令
- 嵌入式开发 迅为开发板 4418开发板can测试内容分享
- 面试题——嵌入式软件开发(1)
- 嵌入式开发-c语言面试题
- 嵌入式开发C语言面试题总结 .
- C/C++嵌入式开发面试题
- C语言面试题(嵌入式开发方向,附答案及点评)
- 高质量的C/C++编程【某市第九研究所嵌入式软件开发工程师面试题】
- 嵌入式开发C语言面试题总结
- ARM芯片学习内容规划及ARM开发环境的搭建 分类: 嵌入式开发学习 2014-06-06 14:17 278人阅读 评论(0) 收藏
- 嵌入式linux开发面试题解析——C语言部分
- 【转】嵌入式开发面试题-NO.1