引入
①端口号
端口号标识一个主机上进行通信的不同程序
在TCP/IP协议中, 用 “源IP”, “源端口号”, “目的IP”, “目的端口号”, “协议号” 这样一个五元组来标识一个通信
②端口号划分
- 0 - 1023: 知名端口号, HTTP, FTP, SSH等这些广为使用的应用层协议, 他们的端口号都是固定的
- 1024 - 65535: 操作系统动态分配的端口号. 客户端程序的端口号, 就是由操作系统从这个范围分配的
③知名端口号
比如:
- ssh服务器, 使用22端口
- ftp服务器, 使用21端口
- telnet服务器, 使用23端口
- http服务器, 使用80端口
- https服务器, 使用443
- sunproxyadmin: 使用8081端口
执行命令vim /etc/services可以查看端口号
④netstat、pidof、killall、ps、 awk、xargs????
netstat:
语法
: netstat [选项]
功能
:查看网络状态
常用选项:
- -n 拒绝显示别名,能显示数字的全部转化成数字
- -l 仅列出有在 Listen (监听) 的服務状态
- -p 显示建立相关链接的程序名
- -t (tcp)仅显示tcp相关选项
- -u (udp)仅显示udp相关选项
- -a (all)显示所有选项,默认不显示LISTEN相关
例如tcp:
pidof 【进程名】
:查看进程的pid
killall
功能:
kill和ps grep等的结合体,用来使用进程名称来杀死进程
参数:
- -e:对长名称进行精确匹配;
- -l:忽略大小写的不同;
- -p:杀死进程所属的进程组;
- -i:交互式杀死进程,杀死进程前需要进行确认;
- -l:打印所有已知信号列表;
- -q:如果没有进程被杀死。则不输出任何信息;
- -r:使用正规表达式匹配要杀死的进程名称;
- -s:用指定的进程号代替默认信号“SIGTERM”;
- -u:杀死指定用户的进程
ps axj | grep 【进程名】
:查看为【进程名】的所有进程
ps axj | hread -nl && ps axj | grep 【进程名】
ps axj | grep 【进程名】| grep -v grep | awk ‘{print $2}’ | xargs kill -p//第二列
gawk 列处理工具
输入记录中的每个字段都可以通过其位置来引用:$1、$2 等等。 $0 是整个记录。字段不需要被常量引用: n = 5 print $n 打印输入记录中的第五个字段
xargs :Linux xargs 命令
⑤所有协议需要解决的两个问题:
需要解决:
- 如何将自己的报头和有效载荷分离的问题
- 任何协议都必须解决,要将自己的有效载荷交付给,上层的哪一个协议
1)UDP
①UDP协议段格式
16位UDP长度, 表示整个数据报(UDP首部+UDP数据)的最大长度;如果校验和出错, 就会直接丢弃
所有协议需要解决的两个问题(对于UDP):
- 通过定长报头
- 16位目的端口号
(1.为什么socket编程中的port是16位的因为协议是16位的 2.为什么server要绑定,因为需要向上层协议交付
)
UDP或者TCP是在内核里面,tcp/ ip协议栈,本质也是Linux内核的一部分
由于Linux内核是用C语言实现的-->内核中,我们的报头其实是位段
struct udp_header { uint32_t src_ port: 16 uint32_t dst_ port:16; uint32_t udp_ length: 16: uint32_t udp_ check: 16; }
位段是一种类型,可以定义变量->开辟空间,保存数据->
填充报头本质上就是给位段类型对应的变量赋值
②UDP缓冲区
sendto, recvfrom,read,write,send, recv等本质并不是把数据发送到网络中,
而是将用户数据拷贝到udp/tcp的发送缓冲区,或者将内核缓冲区中的数据,拷贝到用户
OS中的传输层协议来决定
什么时候发送数据,发送多少数据,丢包了该干嘛(UDP丢包了不管)
UDP具有接收缓冲区. 但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致; 如果缓冲区满了, 再到达的UDP数据就会被丢弃;
UDP的socket能同时读写,全双工
③UDP特点及注意事项
UDP传输的过程.
- 无连接: 知道对端的IP和端口号就直接进行传输, 不需要建立连接;
- 不可靠: 没有确认机制, 没有重传机制; 如果因为网络故障该段无法发到对方, UDP协议层也不会给应用层返回任何错误信息;(
注意 不可靠是 中性词
)- 面向数据报: 不能够灵活的控制读写数据的次数和数量
注意事项:
- UDP协议首部中有一个16位的最大长度. 也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部).,然而64K在当今的互联网环境下, 是一个非常小的数字.,如果我们需要传输的数据超过64K, 就需要在应用层手动的分包, 多次发送, 并在接收端手动拼装
④基于UDP的协议
- NFS: 网络文件系统
- TFTP: 简单文件传输协议
- DHCP: 动态主机配置协议
- BOOTP: 启动协议(用于无盘设备启动)
- DNS: 域名解析协议
2)TCP
引入
冯诺伊曼体系结构中,(硬件与硬件之间是互相独立的&#