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

来源:互联网 发布:淘宝网宽松牛仔裤女款 编辑:程序博客网 时间:2024/06/06 16:44

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(User 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
.指定使用的协议
.IPv4AF_INET
type
.指定套接字类型
.TCPSOCK_STREAM
.UDPSOCK_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进行设置,然后进行强制转换。


addrlensockaddr结构体的大小


返回值:
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);
参数:
sockfdsocket返回的文件描述符
buf发送缓冲区首地址
len发送的字节数


flags0


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);
参数:
sockfdsocket返回的文件描述符
buf接收缓冲区首地址
len接收的字节数


flags0


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
.指定使用的协议
.IPv4AF_INET
type
.指定套接字类型
.TCPSOCK_STREAM
.UDPSOCK_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);





0 0
原创粉丝点击