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

Windows网络编程相关概念

2016-05-19 13:42 267 查看
* IP

IP服务是互联网的关键。IP提供数据包的寻址,路由,分片和重组。

* OSI七层模型

物理层:由计算机和网络介质组成,负责将数据编码成比特流,并以此方式在网络上传输。

数据链路层:负责准备物理层传输,修正传输中的错误,将数据封装成Frame。

网络层:管理网络地址,选择路由,定义数据封包(Packet)等。

传送层:将上次数据分段(Segment),提供端到端的传输,提供服务质量(Qos)等。

会话层:建立,管理,终止会话等。

表示层:将网络传输的内同转为为用户有意义的编码。

应用层:为操作系统或王丽坤应用程序提供访问网络服务的接口。

* TCP/IP模型

应用层:包含会话层,表示层和应用层。包括各种应用程序和协议,如HTTP,FTP等。

传送层:包括传输控制协议(TCP)和用户数据报协议(UDP)。

网络层:包含IP, ARP, RARP, ICMP等。IP提供一种不可靠的服务。

数据链路层:包含物理层和数据链路层。

IP的主要任务是将数据分割成许多较小的封包(packet).并且将这些包发送出去,IP属于无连接的通信协议,不保证每个包都准确无误的传递到目的地,至于封包如何传输,采用何种方式传输有上次协议控制,如TCP或者UDP。

* TCP,UDP区别

TCPUDP
提供面向连接的服务,客户端和服务器端必须建立连接。提供的服务,客户端和服务器端不必建立连接,客户端可直接向服无连接务器端发送消息。
提供可靠服务,发送数据时要去对方返回一个确认,如果没收到确认,将自动重传。为数据进行排序,为每个发送的字节关联一个序列号,从而保证了数据的顺序。提供流量控制,告知对方它能够接收数据的字节数。不确保数据报能最终到达目的地,对数据报的发送不确认,不重发等。
速度比UDP慢,占用资源比UDP多。速度快,占用资源少。
* TCP的连接与终止

三次握手连接:

1.客户端想服务器端发起链接iu,此时客户端发送一个SYN字节。

2.服务器端向客户端发送SYN和对客户端的ACK。

3.客户端确认服务器的SYN。

四次握手终止连接:

1.终止方向对方发送一个FIN分节,表示数据传输完毕。

2.接收方收到FIN,向对方发送ACK.

3.接收方执行了关闭,再发送一个FIN.

4.原始发送方收到FIN后再向对方发送一个ACK.

SYN表示建立连接,FIN表示关闭连接,ACK表示响应,PSH表示有 DATA数据传输,RST表示连接重置。

* 端口

通用端口号(0-1023):这些端口绑定某些服务,通常表明服务的某种协议,如80是HTTP的端口,21是FTP的端口。

已注册的端口号(1024-49151):工一般程序使用,一般在这个范围选择端口号。

动态私有端口(49152-65535)

* socket

简单可以将socket理解为固定电话的插口,可以使用TCP或者UDP方式连接到这个电话插口上,在这个插口的另一方是另外是网络协议和负责传输的硬件,具体有操作系统内核完成。

struct sockaddr_in {
short   sin_family;
u_short sin_port;
struct  in_addr sin_addr;
char    sin_zero[8];
};
sin_family:地址家族,必须为AF_INET。

sin_port:服务端口号.

sin_addr: in_add类型的IP地址。

sin_zero:填充该结构的大小,使之与SOCKADDR相同。

* 可能阻塞的函数为

1.输入操作:

rec(), recvfrom(), WSARecv(), WSARecvfrom().如果套接字缓冲区内没有数据可读,则调用线程在数据来临之前一直等待。

2.输出操作:

send(), sendto(), WSASend(), WSASendto(), 如果套接字缓冲区内没有可用空间,线程会一直睡眠直到有可用空间。

3.接受连接:

accept()和WSAAcept()。如果没有连接请求,线程会进入睡眠状态,

4.外出连接:

connect()和WSAConnect函数。对于TCP连接,在连接收到服务器应答之前,不会返回,意味着TCP连接至少等待客户端到服务器一次往返的时间。

* WSAAsyncSelect Function

使用时必须有一个相应的窗口可以接受消息。对发生网络事件的小结:

FD_READ事件:

当调用WSAAsyncSelect函数时,如果当前有可读数据时。

当数据到达并且没有发送FD_READ网络事件时。

调用recv或者recvform函数后,如果仍有可读数据时。

FD_WRITE事件:

当调用WSAAsyncSelect函数时,如果调用能够发送数据时。

调用connect或者accept函数后,当连接已经建立时。

调用send或者sendto函数,返回WSAEWOULDBLOCKE错误后,在此调用send或者sendto函数可能成功时。

FD_ACCEPT事件:

当调用WSAAsyncSelect函数时,如果当前有连接请求需要接受时。

当连接请求到达时,汗没有发送FD_ACCEPT网络事件。

调用accept函数后,如果还有另外的连接请求需要接受时。

FD_CONNECT事件

当调用WSAAsyncSelect函数时,如果当前一个链接已经建立时。

当调用connect函数后,建立连接完成时。

当调用WSAJoinLeaf函数后,加入操作完成时。

在面向连接的非阻塞套接字上,调用connect,WSAConnct或者WSAJoingLeaf函数后,尝试连接完成时,此时应用程序应该查看错误代码,确定连接是否成功。

FD_cLOSE时间

当调用WSAAsyncSelect函数时,套接字连接关闭时。

对方执行了从容关闭后,没有数据可读时,如果数据已经到达并且等待读取,FD_CLOSE时间不会被发送,直到所有的数据被发送。

调用shutdown函数执行从容关闭,对方应答FIN后,此时如果没有数据可读时。

对方结束了连接,并且lParam包含WASECONNRESET错误时。

* WSAAsyncSelect WSAEvetnSelect Function

同一个套接字上多次调用WSAAsyncSelect或WSAEvetnSelect函数,后一次的调用将会取消前一次的调用效果,对多个事件的注册需用 | 运算符经行连接。

* 杂记

使用INVALID_SOCKET可以验证socket的正确性。

使用SOCKET_ERROR可以验证相关函数的返回值。

其实big endian是指低地址存放最高有效字节(MSB),而little endian则是低地址存放最低有效字节(LSB)。数字0x12345678表示如下:

Big Endian低地址 高地址 谢谢你的好意啊,真不必了。本来我o

----------------------------------------->

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| 12 | 34 | 56 | 78 |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Little Endian低地址 高地址

----------------------------------------->

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| 78 | 56 | 34 | 12 |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

采用big endian方式存储数据是符合我们人类的思维习惯的。

网络字节流采用Big Endian的方式。ntohl()和ntohs()函数实现从网络字节顺序转换为主机字节顺序的功能。

WSAStartup()和WSACleanup()必须成对使用。

SOCKADDR结构因协议的不同而不同,被内核用于存储地址,大小为16字节,在TCP/IP下使用SOCKADDR_IN代替该结构。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: