网络编程课程设计tcp(网络编程课程设计心得)

http://www.itjxue.com  2023-02-11 05:16  来源:未知  点击次数: 

网络工程主要学什么

网络工程专业的学生主要学习课程包含有数据库原理、网络规划与设计、网络编程、网络系统管理、路由交换技术、计算机组成原理、TCP/IP体系结构、通信原理、网络技术导论、数据结构、数据通信、操作系统、数据库系统原理等,另外还得进行网络编程课程设计、综合组网课程设计、数据结构课程设计、毕业设计等专业实践课程。

网络工程专业开设高校情况介绍

国内开设网络工程专业的本科高校高达430余所。其中广东省超过30所,河北、江苏、山东、河南、安徽、江西等省份超过20所,西南地区的四川19所、重庆8所、贵州与云南各7所。

在网络工程专业上比较强势的高校,最著名的就是“两电一邮”了,电子科技大学、西安电子科技大学和北京邮电大学等三所高校最值得推荐。另外如华南理工大学、中山大学、大连理工大学、南京邮电大学、四川大学、东北大学、杭州电子科技大学、西南交通大学、中国地质大学(武汉)、南京信息工程大学、西南大学、重庆邮电大学、长安大学、中国传媒大学等高校均有开设此专业。

网络编程-协议篇

应用层 : 常见的协议有HTTP协议,FTP协议。

传输层 : 常见协议有TCP/UDP协议。

网络层 : 常见协议有IP协议、ICMP协议、IGMP协议。

网络接口层 : 常见协议有ARP协议、RARP协议

IP协议 是因特网互联协议(Internet Protocol)

TCP传输控制协议 (Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

UDP用户数据报协议 (User Datagram Protocol)是 OSI 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。

ICMP协议 是Internet控制 报文 协议(Internet Control Message Protocol)它是 TCP/IP协议族 的一个子协议,用于在IP 主机 、 路由 器之间传递控制消息。

IGMP协议 是 Internet 组管理协议(Internet Group Management Protocol),是因特网协议家族中的一个组播协议。该协议运行在主机和组播路由器之间。

ARP 协议 是正向 地址解析协议 (Address Resolution Protocol),通过已知的IP,寻找对应主机的 MAC地址 。

RARP 是反向地址转换协议,通过MAC地址确定IP地址。

每一层都是为了完成一种功能,为了实现这些功能,就需要大家都遵守共同的规则。大家都遵守这规则,就叫做“协议”(protocol)。

网络的每一层,都定义了很多协议。这些协议的总称,叫“TCP/IP协议”。TCP/IP协议是一个大家族,不仅仅只有TCP和IP协议,它还包括其它的协议,如下图:

以太网规定,连入网络的所有设备,都必须具有“网卡”接口 。数据包必须是从一块网卡,传送到另一块网卡。通过网卡能够使不同的计算机之间连接,从而完成数据通信等功能。网卡的地址——MAC 地址,就是数据包的物理发送地址和物理接收地址。

网卡对应到协议里面就是与链路层ARP协议相关的

每个网卡有自己唯一的Mac地址

ARP可以帮助借助IP获取Mac地址

RARP可以借助Mac地址获取IP

网络层的作用是引进一套新的地址,使得我们能够区分不同的计算机是否属于同一个子网络。这套地址就叫做“网络地址”,这是我们平时所说的IP地址。这个IP地址好比我们的手机号码,通过手机号码可以得到用户所在的归属地。

网络地址帮助我们确定计算机所在的子网络,MAC 地址则将数据包送到该子网络中的目标网卡。网络层协议包含的主要信息是源IP和目的IP。

于是,“网络层”出现以后,每台计算机有了两种地址,一种是 MAC 地址,另一种是网络地址。 两种地址之间没有任何联系 ,MAC 地址是绑定在网卡上的,网络地址则是管理员分配的,它们只是随机组合在一起。

网络地址帮助我们确定计算机所在的子网络,MAC 地址则将数据包送到该子网络中的目标网卡。因此,从逻辑上可以推断,必定是先处理网络地址,然后再处理 MAC 地址。

IP地址本质:2进制数。----点分十进制IP地址(string)

当我们一边聊QQ,一边聊微信,当一个数据包从互联网上发来的时候,我们怎么知道,它是来自QQ的内容,还是来自微信的内容?

也就是说,我们还需要一个参数,表示这个数据包到底供哪个程序(进程)使用。这个参数就叫做“端口”(port),它其实是每一个使用网卡的程序的编号。每个数据包都发到主机的特定端口,所以不同的程序就能取到自己所需要的数据。

端口就是在传输层指定的。

port -- 在一台主机上唯一标识一个进程

端口特点:

对于同一个端口,在不同系统中对应着不同的进程

对于同一个系统,一个端口只能被一个进程拥有

常用协议:TCP、UDP

应用程序收到“传输层”的数据,接下来就要进行解读。由于互联网是开放架构,数据来源五花八门,必须事先规定好格式,否则根本无法解读。“应用层”的作用,就是规定应用程序的数据格式。

FTP、HTTP、或自定义协议

对数据进行封装、解封装

网络编程和tcpip都要看吗

是。网络编程和tcpip是都要看的,网络编程从大的方面说就是对信息的发送到接收,中间传输为物理线路的作用,tcpip是供已连接因特网的计算机进行通信的通信协议。

Golang 网络编程丝绸之路 - TCP/UDP 地址解析

TL;DR 在使用 Golang 编写 TCP/UDP socket 的时候,第一步做的就是地址解析。

该函数返回的地址包含的信息如下:

TCPAddr 里, IP 既可以是 IPv4 地址,也可以是 IPv6 地址。 Port 就是端口了。 Zone 是 IPv6 本地地址所在的区域。

从返回结果看该函数的参数, network 指 address 的网络类型; address 指要解析的地址,会从中解析出我们想要的 IP , Port 和 Zone 。

从源码中可以看出,参数 network 只能是如下四个值,否则会得到一个错误。

解析过程跟 ResolveTCPAddr 的一样,不过得到的是 *UDPAddr 。

UDPAddr 包含的信息如下:

linux tcp/ip 网络通信编程

/*************************************

文件名:?server.c?

linux?下socket网络编程简例??-?服务端程序

服务器端口设为?0x8888???(端口和地址可根据实际情况更改,或者使用参数传入)

服务器地址设为?192.168.1.104

作者:kikilizhm#163.com?(将#换为@)

*/

#include?stdlib.h

#include?sys/types.h

#include?stdio.h

#include?sys/socket.h

#include?linux/in.h

#include?string.h

int?main()

{

int?sfp,nfp;?/*?定义两个描述符?*/

struct?sockaddr_in?s_add,c_add;

int?sin_size;

unsigned?short?portnum=0x8888;?/*?服务端使用端口?*/

printf("Hello,welcome?to?my?server?!\r\n");

sfp?=?socket(AF_INET,?SOCK_STREAM,?0);

if(-1?==?sfp)

{

????printf("socket?fail?!?\r\n");

????return?-1;

}

printf("socket?ok?!\r\n");

/*?填充服务器端口地址信息,以便下面使用此地址和端口监听?*/

bzero(s_add,sizeof(struct?sockaddr_in));

s_add.sin_family=AF_INET;

s_add.sin_addr.s_addr=htonl(INADDR_ANY);?/*?这里地址使用全0,即所有?*/

s_add.sin_port=htons(portnum);

/*?使用bind进行绑定端口?*/

if(-1?==?bind(sfp,(struct?sockaddr?*)(s_add),?sizeof(struct?sockaddr)))

{

????printf("bind?fail?!\r\n");

????return?-1;

}

printf("bind?ok?!\r\n");

/*?开始监听相应的端口?*/

if(-1?==?listen(sfp,5))

{

????printf("listen?fail?!\r\n");

????return?-1;

}

printf("listen?ok\r\n");

while(1)

{

sin_size?=?sizeof(struct?sockaddr_in);

/*?accept服务端使用函数,调用时即进入阻塞状态,等待用户进行连接,在没有客户端进行连接时,程序停止在此处,

???不会看到后面的打印,当有客户端进行连接时,程序马上执行一次,然后再次循环到此处继续等待。

???此处accept的第二个参数用于获取客户端的端口和地址信息。

????*/

nfp?=?accept(sfp,?(struct?sockaddr?*)(c_add),?sin_size);

if(-1?==?nfp)

{

????printf("accept?fail?!\r\n");

????return?-1;

}

printf("accept?ok!\r\nServer?start?get?connect?from?%#x?:?%#x\r\n",ntohl(c_add.sin_addr.s_addr),ntohs(c_add.sin_port));

/*?这里使用write向客户端发送信息,也可以尝试使用其他函数实现?*/

if(-1?==?write(nfp,"hello,welcome?to?my?server?\r\n",32))

{

????printf("write?fail!\r\n");

????return?-1;

}

printf("write?ok!\r\n");

close(nfp);

}

close(sfp);

return?0;

}

/*************************************

文件名:?client.c?

linux?下socket网络编程简例??-?客户端程序

服务器端口设为?0x8888???(端口和地址可根据实际情况更改,或者使用参数传入)

服务器地址设为?192.168.1.104

作者:kikilizhm#163.com?(将#换为@)

*/

#include?stdlib.h

#include?sys/types.h

#include?stdio.h

#include?sys/socket.h

#include?linux/in.h

#include?string.h

int?main()

{

int?cfd;?/*?文件描述符?*/

int?recbytes;

int?sin_size;

char?buffer[1024]={0};????/*?接受缓冲区?*/

struct?sockaddr_in?s_add,c_add;?/*?存储服务端和本端的ip、端口等信息结构体?*/

unsigned?short?portnum=0x8888;??/*?服务端使用的通信端口,可以更改,需和服务端相同?*/

printf("Hello,welcome?to?client?!\r\n");

/*?建立socket?使用因特网,TCP流传输?*/

cfd?=?socket(AF_INET,?SOCK_STREAM,?0);

if(-1?==?cfd)

{

????printf("socket?fail?!?\r\n");

????return?-1;

}

printf("socket?ok?!\r\n");

/*?构造服务器端的ip和端口信息,具体结构体可以查资料?*/

bzero(s_add,sizeof(struct?sockaddr_in));

s_add.sin_family=AF_INET;

s_add.sin_addr.s_addr=?inet_addr("192.168.1.104");?/*?ip转换为4字节整形,使用时需要根据服务端ip进行更改?*/

s_add.sin_port=htons(portnum);?/*?这里htons是将short型数据字节序由主机型转换为网络型,其实就是

????将2字节数据的前后两个字节倒换,和对应的ntohs效果、实质相同,只不过名字不同。htonl和ntohl是

????操作的4字节整形。将0x12345678变为0x78563412,名字不同,内容两两相同,一般情况下网络为大端,

????PPC的cpu为大端,x86的cpu为小端,arm的可以配置大小端,需要保证接收时字节序正确。

?*/

printf("s_addr?=?%#x?,port?:?%#x\r\n",s_add.sin_addr.s_addr,s_add.sin_port);?/*?这里打印出的是小端

????和我们平时看到的是相反的。?*/

/*?客户端连接服务器,参数依次为socket文件描述符,地址信息,地址结构大小?*/

if(-1?==?connect(cfd,(struct?sockaddr?*)(s_add),?sizeof(struct?sockaddr)))

{

????printf("connect?fail?!\r\n");

????return?-1;

}

printf("connect?ok?!\r\n");

/*连接成功,从服务端接收字符*/

if(-1?==?(recbytes?=?read(cfd,buffer,1024)))

{

????printf("read?data?fail?!\r\n");

????return?-1;

}

printf("read?ok\r\nREC:\r\n");

buffer[recbytes]='\0';

printf("%s\r\n",buffer);

getchar();?/*?此句为使程序暂停在此处,可以使用netstat查看当前的连接?*/

close(cfd);?/*?关闭连接,本次通信完成?*/

return?0;

}

网络编程的tcp和udp的详细区别。。。要通俗易懂的

TCP是可靠连接,不需要你考虑网络中的丢包、乱序问题。

UDP是不可靠连接,需要自己考虑报文的乱序和重组问题。

当然,UDP的性能要比TCP高。

(责任编辑:IT教学网)

更多

推荐安全技术文章