TCPIP⽹络编程笔记——尹圣⾬
问题:
1. write函数 第⼆个参数,为什么转换成char*形式?
⾃⼰理解:char⼤⼩为1,转换成char指针,表⽰从第⼀个字节开始,第三个参数表⽰传递⼤⼩——字节数。与地址指针对应
2. 传输数据时,数据的格式是什么?
3. 9.2中⽤SO_REUSEADDR后,Time_Wait状态时端⼝号被分配给其他套接字,但是最后的ACK消息没有正常传到主机B,此时B进⾏
FIN消息重传,会不会传到其他位置(端⼝号已经分配给其他套接字)(重传时是否还需要端⼝号??)
4.
⽹络编程
第⼀章
⼤致函数作⽤
socket——》安装电话机;
bind——》分配电话号码;
listen——》连接电话线;
accept——》拿起话筒;
connect——》打电话。
**⽂件描述符:**系统分配给⽂件或套接字的整数。(⼀种标识)
LINUX->描述符;windows ->句柄
0、1、2是分配给标准I/O的描述符;然后从3开始以由⼩到⼤的顺序编号。
linux⽂件操作
int open(const char *path, int flag);
/
/ path ⽂件名的字符串地址; flag ⽂件打开模式信息 --> 成功时返回⽂件描述符,失败时返回-1。
#include <unistd.h>
int close(int fd); // fd 需要关闭的⽂件或套接字的⽂件描述符。--> 成功时返回0,失败时返回-1。
ssize_t write(int fd, const void* buf, size_t nbytes);// fd 显⽰数据传输对象的⽂件描述符;buf 保存要传输数据的缓冲地址值。
// nbytes 要传输数据的字节数 --> 成功时返回写⼊的字节数,失败时返回-1。
ssize_t read(int fd, void *buf, size_t nbytes); // fd 显⽰数据接收对象的⽂件描述符;buf 要保存接收数据的缓冲地址值;
//nbytes 要接收数据的最⼤字节数 --> 成功时返回接收字节数(但遇到⽂件结尾则返回0),失败时返回-1。
//size_t表⽰unsigned int类型,ssize_t标识signed int类型
//* 数据类型_t 表⽰元数据类型,为操作系统定义的, 在 sys/types.h⽂件中⼀般由typedef声明定义
第⼆章套接字类型与协议设置–socket函数
2.1 套接字协议及其数据传输特性
协议:计算机间对话必备通信规则。
创建套接字
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
//--> 成功时返回⽂件描述符,失败时返回-1。
//domain 套接字中使⽤的协议族(Protocol Family)信息;
//type 套接字数据传输类型信息;
//protocol 计算机通信中使⽤的协议信息。
协议族(Protocol Family)
套接字实际采⽤的最终协议信息是通过第三个参数传递的,在指定的协议族范围内通过第⼀个参数决定第三个参数。
套接字类型(Type)
指的是套接字的数据传输⽅式。 协议族中存在多种数据传输⽅式。
Type1:⾯向连接的套接字(SOCK_STREAM)
⾯向连接的套接字除特殊情况外不会发⽣数据丢失。
特征:传输过程中数据不会消失;
按序传输数据;
传输的数据不存在数据边界(Boundary)。
**“传输数据的计算机通过3次调⽤write函数传递了100字节的数据,但接收数据的计算机仅通过1次read函数的调⽤就接收了全部100字节。” **
收发数据的套接字内部有缓冲(buffer),简⾔之就是字节的数组。通过套接字传输的数据将保到该数组。因此,收到数据并不意味着马上调⽤read函数。 只要不超过数组容量,则有可能在数据填充满缓冲后通过⼀次read函数调⽤读取全部,也有可能分成多次read函数调⽤进⾏读取。也就是说,在⾯向连接的套接字中,read函数和write函数的调⽤次数并⽆太⼤意义。
“接字连接必须是⼀⼀对应”
“可靠的、按需传递的、基于字节的⾯向连接的数据传输⽅式的套接字”
Type2:⾯向消息的套接字(SOCK_DGRAM)
强调快速传输⽽⾮传输顺序。
传输的数据可能丢失也可能损毁。
传输的数据有数据边界。——》意味着接收数据的次数应和传输次数相同。
限制每次传输的数据⼤⼩。
特性:“不可靠、不按顺序传递的、以数据的⾼速传输为⽬的的套接字”
协议的最终选择
前两个参数即可创建所需的套接字,所以⼤部分情况下可以向第三个参数传递0,除⾮遇到:“同⼀协议族中存在多个数据传输⽅式相同的协议”
即数据传输⽅式相同,但协议不同。便需要第三个参数指定协议信息。
第三章地址族与数据序列–bind函数
3.1 分配给套接字的IP地址与端⼝号
IP 是为收发⽹络数据⽽分配给计算机的值。
端⼝号是为区分程序中创建的套接字⽽分配给套接字的序号 。
⽹络地址
先浏览IP地址的⽹络地址,把数据传到相应的⽹络;再浏览数据的**主机地址(主机ID)**并将数据传给⽬标计算机。
⽤于区分套接字的端⼝号
利⽤端⼝号才能将数据传输到相应⽬的应⽤程序
计算机中⼀般配有NIC(Network Interface Card,⽹络接⼝卡(⽹络适配器、⽹卡))数据传输设备。通过NIC向计算机内部传输数据时会⽤到IP。
操作系统负责把传递到内部的数据适当分配套接字,这时就要利⽤端⼝号。也就是说,通过NIC接收的数据内有端⼝号,操作系统正是参考此端⼝号把数据传输给相应端⼝的套接字。
端⼝号就是在同⼀操作系统内为区分不同套接字⽽设置的,因此⽆法将1个端⼝号分配给不同的套接字。另外,端⼝号由16位构成,可分配端⼝号范围从0-65535。但0-1023是知名端⼝(Well-known PORT),⼀般分配给特定应⽤程序,所以应当分配范围之外的值。
端⼝不能重复,但TCP套接字和UDP套接字不会公⽤端⼝号,所以允许重复。
3.2 地址信息的表⽰
应⽤程序中使⽤的IP地址和端⼝号以结构体的形式给出定义。
表⽰IPv4地址的结构体
struct sockaddr_in
{
sa_family_t sin_family; //地址族(Address Family)
uint16_t sin_port; //16位TCP/UDP端⼝号
struct in_addr sin_addr; //32位IP地址
char sin_zero[8]; //不使⽤
};
该结构体中提到的另⼀个结构体in_addr定义如下,它⽤来存放32位IP地址。
struct in_addr
{
in_addr_t s_addr; //32位IPv4地址
tcpip协议pdf
};
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论