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

Unix网络编程一、二章笔记

2016-04-12 17:26 716 查看

Unix网络编程一、二章笔记

注:大部分内容是在阅读《Unix网络编程卷一》后,结合自己理解做的笔记,供自己回忆思考。
     

  1.客户端与服务器tcp通信例子

       客户与服务器之间使用应用协议通信,在传输层却使用TCP协议通信。客户与服务器之间的信息流在其中一端是向下通过协议栈的,跨越网络后是向上通过协议栈的。客户和服务器通常是用户进程,而TCP和IP协议通常是内核中协议栈的一部分。如下图,给出了客户与服务器使用tcp在以太网中通信的简单例子。


2.  使用Unix网络编程源码

        由于在按照readme执行make的时候出现错误,所以查找了一下解决方法。详情可以参考http://blog.sina.com.cn/s/blog_beb8b5d70101dq1a.html
       同时,在执行第一个测试daytime的程序时,由于系统默认不开启daytime服务,所以会connection refused。解决方法参考http://blog.sina.com.cn/s/blog_a43aba560101a2s5.html。
其中在程序daytimetcpcli.c中,关于一些函数的解释:
inet_pton:将IP地址
“点分十进制” -> “二进制整数”
inet_ntop
:
将IP地址 “二进制整数” -> “点分十进制”
上述两个函数均可以处理IPv4和IPv6地址
htons:将整型变量从主机字节顺序转变成网络字节顺序
就是整数在地址空间存储方式变为:高位字节存放在内存的低地址处。(摘自百度百科htons



注意:书中在unp.h中用#define将SA定义为 struct sockaddr(通用套接字地址结构)
read函数返回服务器端的应答tcp分节,如果数据量大就不能保证一次read调用能返回服务器的整个应答。因此从TCP套接字读取数据时,总是要把read写在某个循环中,当read返回0(表明对端关闭链接)或负值(表明发生错误)时,终止循环。

包裹函数:首字母大写,对一些函数的调用作处理,包裹正常返回值和错误处理。

获取时间的程序(服务器端):
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
这里将IP地址指定为INADDR_ANY,如果服务器端有多个网络接口,那么其就可以在任意一个网络接口上接受客户连
接。



socket, bind, listen 三个调用步骤是任何TCP服务器准备“监听描述符”的正常步骤。其中 listen(listenfd, LISTENQ)将套接字转换一个监听套接字, LISTENQ是定义在书中的unp.h中,指定系统内核允许在这个监听描述符上排队的最大客户连接数。



通常情况下,服务器进程在accept调用中被投入睡眠,等待某个客户连接的到达并被内核接受。TCP连接使用三次握手建立连接,握手完毕时accept返回一个“已连接描述符”,代码中是connfd。这个描述符用于与新近建立的连接的客户进行通信。accept为每个连接到本服务器的客户返回一个新的描述符。





第二章

传输层:
TCP: 复杂、可靠的字节流协议
UDP: 简单、不可靠的数据报协议
SCTP:流控制传输协议(较新,最初设计用于跨越因特网传输电话信令)
这些协议都转而使用网络层协议IPv4或IPv6。 可以绕过传输层使用IPv4或IPv6协议(极少使用这种方法),称为原始套接字。

用户数据报协议(UDP):
用户进程往一个UDP套接字写入一个消息,该消息会被封装到一个UDP数据报,该数据报进而会被封装到一个IP数据报发往目的地。如果一个UDP数据报到达了目的地但校验和检测发生错误,或者在网络传输途中被丢弃了,他就无法被投递给UDP套接字,源端也不会重传改UDP数据报。每个UDP数据报都有一个长度,如果一个UDP数据报正确到达其目的地,该数据报长度随着数据一起被目的地应用程序接收。
 
传输控制协议(TCP):
TCP提供客户与服务器之间的连接。TCP先与某个客户建立一个连接,再跨过这个连接与那个服务器交换数据,然后终止这个连接。

RTT(往返时间):
客户与服务器之间的往返时间,TCP有动态估算RTT的算法。RTT受网络流通各种变化因素的影响,所以TCP需要持续估算一个给定连接的RTT。

TCP根据要发送字节大小切割成大小相等的分节,每个分节有一个序列号,再把所有分节发给IP报文,分节可能不按顺序到达对端,所以会依靠分节的序列号对分节重新组合,另一种情况是,由于网络原因,有分节被认为在网络中丢失了(其实没丢失),客户端重传分节,该分节后来到达,可以根据序列号判断分节的内容重复,然后舍弃。

通告窗口:
TCP提供流量控制,在任何时刻都告知对端其自身能一次从对端接收多少字节的数据,称为通告窗口。当TCP对某个套接字的接收缓冲区已满,它必须等待其他应用从缓冲区读取数据时,方能从对端再接收数据。
全双工:
TCP是全双工的,在一个给定连接上应用可以在任何时刻在进出两个方向上既发送又接收数据。
三次握手的SYN的常用TCP选项:
MSS选项:最大分节大小,即每个TCP分节愿意接收的最大数据量。
窗口规模
时间戳选项
下图详解TCP连接时的三次握手以及四次断开的状态:



TIME_WAIT状态:持续2MSL(一个MSL一般是30s或2分钟)

流控制传输协议(SCTP):
SCTP是面向消息的,提供各个记录的按序递送服务。SCTP能在所连接的端点之间提供多个流,每个流各自可靠地按序递送消息。还提供多宿特性,使得单个SCTP端点能够支持多个IP地址。

端口号:
众所周知的端口号:0~1023 如FTP(21),UDP(69)
临时端口号:客户通常使用短期存活的临时端口,这些端口通常由传输层协议自动赋给客户,客户不关心端口的具体值,由传输层协议的代码确保该端口在所在主机中是唯一的。

套接字对:
定义该连接两个端点的四元组:本地IP地址、本地TCP端口号、外地IP地址、外地TCP端口号。套接字对唯一标识一个网络上的一个TCP连接。

缓冲区大小及限制
MTU:最大传输单元
两个主机间的路径中最小的MTU称为路径MTU,如今常见的路径MTU是1500字节;两个主机间相反方向的路径MTU可以不一
9544
致的,因为在因特网中路由选择往往是不对称的。
当一个IP数据报将要从某个接口送出时,如果他的大小超过相应链路的MTU,IPv4和IPv6都会执行分片,这些分片在到达最终目的地之前都不会被重组。IPv4主机对其产生的数据报执行分片,IPv4路由器对其转发的数据报执行分片。IPv6只有主机对其产生的数据报进行分片,IPv6路由器不对其转发的数据报执行分片。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  网络编程 笔记