网络层是怎么知道目的IP的?

why0727 2010-07-02 02:19:50
网络层的数据包里面包含有一个目的IP字段,但是这个目的IP是怎么获得的呢?应该是应用层知道对方的IP才需要通信,但是应用层知道对方的IP怎么能够传到IP层呢?传输层又不包含目的IP,而且IP层也不会检查传输层的字段啊
...全文
1376 31 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
do_fork 2010-07-02
  • 打赏
  • 举报
回复
以Linux为例,所有的相关数据都在socket buffer(struct sk_buff *skb)中,

connect时或者accept之前,另一端的ip地址(daddr)会写入到ip头,

使用ip_hdr(skb)可以取得ip头,ip头中包含了daddr.
cswuyg 2010-07-02
  • 打赏
  • 举报
回复

回个技术贴都得截图,说啥好呢……
lzl_2008 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 why0727 的回复:]
引用 23 楼 zhzxlc_06 的回复:

楼主看下TCP/IP协议的任何一本书
在IP层的分组叫做IP数据包,IP数据包的格式分为首部区和数据区
首部区里就包含了源IP地址和目的IP地址!

这我知道,我问的就是IP数据包首部包含的目的IP地址是怎么来的?应用层绕过传输层直接给它的?
[/Quote]
应用层给传输层,传输层传给网络层。传输层自已不用IP, 也可能直接把IP丢弃。
cattycat 2010-07-02
  • 打赏
  • 举报
回复
你socket编程的时候,一般设置目的IP和端口就行了。socket底层和操作系统会把你的目的IP填充到IP头部,然后获取自己机器的ip填写到IP头部。如果是Raw socket,就需要自己干这些事情了。
aqiu348503 2010-07-02
  • 打赏
  • 举报
回复
TCP传输层的send函数大概是这么实现的
send(socket句柄,数据包)
{
通过socket句柄找到源地址、目的地址
分片
for(每片)
{
网络层数据包 = 源地址+目的地址+传输层数据包
网络层的send(网络层数据包);
}
}
yuanzhang198711 2010-07-02
  • 打赏
  • 举报
回复
这个原理不解释,楼主看下计算机网络ok?
zheyimiao 2010-07-02
  • 打赏
  • 举报
回复
lz是说tcp包没有包含ip地址,ip包却包含了ip地址是吧?

猜想ip层打包的时候直接用了应用层的参数.
why0727 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 zhzxlc_06 的回复:]

楼主看下TCP/IP协议的任何一本书
在IP层的分组叫做IP数据包,IP数据包的格式分为首部区和数据区
首部区里就包含了源IP地址和目的IP地址!
[/Quote]
这我知道,我问的就是IP数据包首部包含的目的IP地址是怎么来的?应用层绕过传输层直接给它的?
chaoliu1024 2010-07-02
  • 打赏
  • 举报
回复
楼主看下TCP/IP协议的任何一本书
在IP层的分组叫做IP数据包,IP数据包的格式分为首部区和数据区
首部区里就包含了源IP地址和目的IP地址!
why0727 2010-07-02
  • 打赏
  • 举报
回复
看来我发这个帖放错地方了,这里都是搞C++语法的
why0727 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 hairetz 的回复:]

引用 7 楼 why0727 的回复:
对方的IP只有应用层知道吧,我想不明白的是应用层知道对方IP,怎么把这个IP地址让自己的IP层知道呢



应用层是封装在最外面的一层,应用层能知道ip地址,它怎么会读不到ip头里的目的ip呢。楼主,下个抓包工具看下包结构吧。
[/Quote]
我并不是问IP层怎么读上层传下来的报文,我问的是IP层的报头包含的目的IP对于IP层而言是怎么知道的,这么多人要我看什么书,其实我已经看过了,我就是没想明白这个问题所以才到这里问
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 why0727 的回复:]
对方的IP只有应用层知道吧,我想不明白的是应用层知道对方IP,怎么把这个IP地址让自己的IP层知道呢
[/Quote]


应用层是封装在最外面的一层,应用层能知道ip地址,它怎么会读不到ip头里的目的ip呢。楼主,下个抓包工具看下包结构吧。
赵4老师 2010-07-02
  • 打赏
  • 举报
回复
《TCP-IP详解卷一:协议》
why0727 2010-07-02
  • 打赏
  • 举报
回复
再说IP层也不会检查传输层的字段啊
why0727 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 linux7985 的回复:]
引用 5 楼 why0727 的回复:
我知道IP层要包含目的IP,我是问IP层是怎么拿到目的IP的?



你访问一个网站,要不要输入域名和地址啊?
你写一个Socket要连接一台服务要不要提供IP和端口号啊
[/Quote]

所以我问编程时提供的目的IP是怎么进入IP包的报头里面去的?所有的数据不都是应该从应用层开始往下层传的吗?但是我看到在传输层并不包含IP地址字段啊
pengzhixi 2010-07-02
  • 打赏
  • 举报
回复
晕 ,你那报文里面就包含了的啊。
why0727 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 chonet2009 的回复:]
这句错了:

IP层获取自己的IP和对方的IP并不依靠应用层,
[/Quote]

获取自己的IP是没有问题的,
你说的路由表是路由的问题,我现在是,譬如说要给某个IP发一个信息,这个IP肯定要包含在网络层的数据包里面,网络层怎么获得这个IP的?因为这个IP是在应用层出现的,而应用层的这个数据是如何让网络层知道的?
烈火蜓蜻 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 why0727 的回复:]
我知道IP层要包含目的IP,我是问IP层是怎么拿到目的IP的?
[/Quote]


你访问一个网站,要不要输入域名和地址啊?
你写一个Socket要连接一台服务要不要提供IP和端口号啊
cattycat 2010-07-02
  • 打赏
  • 举报
回复
看TCP/IP详解第一卷吧,比较好理解。
TCP层有目的IP,目的端口,源IP,源端口。TCP层数据被IP层抽取到目的IP和源IP,协议会自己做这个事情,你自己看不到而已。数据从应用层设置后,协议会帮你设置目的IP,源IP.如果你是原始Raw套接字编程的话,所有的包填充和设置都需要你自己做了。
  • 打赏
  • 举报
回复
socket上下文管理

你说的IP地址与socket中的实现是不一样的

所以在应用层你看见的IP是32位的IPV4格式

但是在底层通信的时候,这些信息将按照IP协议转换为固定格式加载IP包头。。
加载更多回复(11)

65,194

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧