网络编程学习总结

主题:
简介:
参考:
网络编程教程
路由器工作原理
IP地址分类
MAC地址绑定
为什么使用三层交换机
作者:
时间:
1.在Linux系统中,为了统一对各种硬件的操作,简化接口,不同的硬件设备也都被看成一个文件。
为了表示和区分已经打开的文件,Linux会给每个文件分配一个ID,这个ID就是一个整数,被称为文件描述符。
0 stdin 键盘
1 stdout 显示器

注:Linux下一切都是文件!!!

2.socket类型
根据数据的传输方式,可以将Internet套接字分为两种类型:
(1)流格式套接字:面向连接的套接字
表示:SOCK_STREAM
SOCK_STREAM是一种可靠的、双向的通信数据流,数据可以准确无误的到达另一台计算机,如果文件损坏或丢失,可以利用自己的纠错机制,可以重新发送。
特征:
数据在传输过程中不会消失:
数据按照顺序传输;
数据的发送和接收是不同步的,也即不存在数据边界。
使用的协议:TCP/IP
TCP确保数据传输的准确性;
IP用来控制数据如何从源头到达目的地;

收发不同步:
流格式套接字的内部有一个缓冲区,也就是字符数组,通过socket传输的数据将保存到这个缓冲区,只要数据不超过缓冲区的容量就可以。
应用:
浏览器使用的http协议就基于面向连接的套接字。

(2)数据报格式套接字
数据报格式套接字也叫无连接的套接字,在代码中使用SOCK_DGRAM表示。计算机只管传输数据,如果数据在传输中损坏或者没有到达另一台计算机,则无法补救,无法重传。
SOCK_DGRAM特征:
快速传输;
传输数据可能丢失;
限制每次传输的数据大小;
数据的发送和接收是同步的;
应用:
视频语音

原则:尽最大努力

4.OSI7层理论模型
OSI7层理论模型缺点:分层太多,增加了网络工作的复杂性。
注:TCP/IP四层应用模型

我们平常使用的程序一般都是通过应用层来访问网络的,程序产生的数据会一层一层的往下传输,直到最后的网络接口层,就通过网线发送到互联网,数据每过一层就需要增加一层的包装。对端结算及接收到数据包时,会从网络接口层一层一层往上传输,每传输一层就拆开一层,直到最后的应用层,得到了最原始的数据。
socker编程是在传输层基础上的TCP/UDP,不能干访问网页的事情,因为访问网页所需要的HTTP协议位于应用层。
5.TCP/IP协议族
协议:网络通信过程中的约定,通信双方都必须遵守。
6. IP、MAC、端口号
IP地址:路由器工作原理
MAC地址:MAC地址绑定
端口号:

7.Linux下的socket演示

10.使用socket()函数创建套接字
Linux中的一切都是文件,每个文件都有一个整数类型的文件描述符;socket也是一个文件,也有文件描述符,使用socket函数创建套接字之后,返回值就是一个int类型的文件描述符。
11.bind()函数和connect()函数
bind\connect\listen\accept\write\read函数的使用。
服务器端:bind函数
服务器端用bind函数将套接字与特定的IP地址和端口绑定起来,流经该IP地址和端口的数据才可以交给套接字处理。
客户端:connect函数
12.listen()函数和accept()函数

对于服务器端的程序,使用bind()函数绑定socket之后,需要使用listen()函数让套接字进入被动监听状态,在调用accept()函数,就可以响应客户端的请求了。
listen()让套接字处于监听状态,不会接收请求,accept()函数接收请求。
套接字处于监听状态时,可以通过accept()函数来接收客户端请求。
accept()函数返回一个新的套接字来和客户端通信。
13.write()函数和read函数
write()函数:向套接字中写入数据
read()函数:从套接字读取数据

14.使用socket编程实现echo客户端
客户端可以向服务器发送数据,服务器根据客户端不同的请求做出不同的响应。其应用就是http,请求的网址不同,返回的页面也不同。
15.服务器持续监听客户端的请求
服务器端:创建套接字-绑定套接字-进入监听状态-接收客户端请求-利用while循环持续监听-关闭套接字
客户端:向服务器发起请求-使用while循环-创建套接字-获取用户输入的字符串并发送给服务器-接受服务器传回的数据-输出接收到的数据。
16.socket缓冲区以及阻塞模式
socket缓冲区:输入缓冲区与输出缓冲区
阻塞模式。
17.TCP粘包问题(数据的无边界性)
从socket缓冲区和数据的传递过程可以发现,数据的接收和发送是无关的。
数据的无边界性:客户端发送的多个数据包被当做一个数据包接收,因为接收函数不知道数据包的开始或者结束标志,只能当做连续的数据流处理。

18.TCP数据报结构以及三次握手

TCP数据报结构
三次握手:
三次握手
19.TCP套接字的数据交换
TCP套接字的数据交换
20.四次挥手
四次挥手
21.shutdown与close
shutdown()函数:用来关闭连接,而不是套接字,不管调用多少次shutdown(),套接字依然存在,直到调用close()/closesocket()函数将套接字从内存中清除。
close()/closesocket()函数用来关闭套接字,将套接字从内存中清除,之后再也不能使用该套接字,应用程序关闭套接字相关的连接和缓存也失去了意义,TCP协议会自动触发关闭连接的操作。
22.socket编程实现文件传输功能
???
23.网络数据传输时的大小端问题
不同CPU保存和解析数据的方式不同,小端和大端系统通信时会发生数据解析错误,因此在发送数据前,需要将数据转换成统一的格式也即网络字节序,也就是是大端序。
大端序:高位字节放在低位地址;
小端序:高位字节放在放在高位地址;

注:为sockadd_in成员赋值时需要显式地将主机字节序转换为网络字节序,而通过write()函数发送数据时TCP协议会自动转换成网络字节序,不需要在调用相应的函数。
24.在socket编程中使用域名
DNS
通过域名获取IP地址:
26.基于UDP的服务器端和客户端
UDP中的服务器端和客户端没有连接;
UDP服务器端和客户端只需要一个套接字。
UDP套接字不会保持连接状态,每次传输数据都需要添加目标地址信息,因此UDP发送函数sendto()与TCP发送函数write()/send()的最大区别是,sendto()寒素需要像他传递目标地址信息。
基于UDP的回声服务器端/客户端:
UDP不同于TCP,不存连接请求建立和受理过程,提供服务的就成为服务器端。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值