(해결)NAT를 사용하면 실제로 어떤 변화가 생기나요?

jailbird의 이미지

Q&A 게시판 중에서는 적절한 곳을 찾기 힘들어 이곳에 올려봅니다.
굳이 연결짓자면 iptable 활용에 관한 Q&A라 할까요?

이야기를 단순화하기 위해 아래와 같이 가정하였습니다.
송수신 패킷 구조 : [Ethernet Frame][TCP Header][IP Header][Data]
네트워크 연결 구조

              [DeskTop]----------------[NAT/Router]-----------[KLDP]
IP Address   192.168.0.2       192.168.0.1     x.y.z.1        x.y.z.2
MAC Address       0A                0B           0C             0D

아시다시피 Ethernet Frame에는 출발지와 목적지의 MAC Address가 TCP header에는 출발지와 목적지의 port가 IP header에는 출발지와 목적지의 IP address가 들어갑니다. 보통의 일반적인 라우팅이라면 TCP header나 IP header의 내용은 변경없이 Ethernet Frame의 MAC Address만 변경해서 패킷을 송수신하는 것으로 알고 있습니다. DeskTop에서 KLDP의 홈페이지를 열어볼 경우 사설 IP가 아니고 그냥 Router만 통과한다면 다음과 같이 되겠죠. 각각의 헤더는 [Source|Destination]으로 표시하였습니다.

1) Desktop   [0A|0B][1234|80][192.168.0.2|x.y.z.2][Data1] 생성, 발송
2) Router    [0C|0D][1234|80][192.168.0.2|x.y.z.2][Data1] 변경, 발송
3) KLDP      [0D|0C][80|1234][x.y.z.2|192.168.0.2][Data2] 생성, 발송
4) Router    [0B|0A][80|1234][x.y.z.2|192.168.0.2][Data2] 변경, 발송
5) Desktop   패킷 수신 및 웹브라우저에 표시

라우팅에 대해서는 이렇게 이해하고 있는데, 잘못된 부분이 있다면 테클 걸어주세요.

다시 주제로 돌아가서, NAT를 사용하면 이 TCP header, IP header도 수정하고 그 내용을 기록하겠지요? 개략적인 설명은 몇몇 문서에서 찾을 수 있었으나 구체적으로 각각의 내용이 어떻게 변경이 되는지 찾을 수가 없어서 이렇게 질문을 드려봅니다. 위의 라우팅 과정처럼 NAT 과정의 변화를 속시원히 좀 드러내주세요.

File attachments: 
첨부파일 크기
Plain text icon NAT_cap.txt8.21 KB
Plain text icon NAT_cap.txt8.21 KB
dgkim의 이미지

패킷이 덮어씌워지는 순서가 틀렸습니다.

EtherFrame - IPDatagram - TCPPacket - Data

위와 같이 IP위에 TCP가 올라갑니다.

그리고 라우팅에 대한 이해는 제대로 알고 계신 것입니다.

이더넷의 프레임의 주소가 바뀌는 것은 맞는데..

다시 생각하실 내용은..

패킷을 다시 생성합니다.

그래서 라우터가 패킷을 받으면 Ethernet을 때어낸다음

다시 나갈 때 다시 만들며, 인터넷이란 것이 Ethernet으로만 이루어진 것이 아니기에

들어온 이더넷 프레임은 나갈 때 Atm Cell로 나갈 수도 있죠..( 맞나?)

그리고 NAT를 한다면 가장 기본적은 것은..

IP Header에서 당연히 Source를 변경하게 되죠(SNAT의 경우)

그리고 그 패킷은 NAT Table에 기록되어 돌아온 패킷을 원래 호스트로 전달하죠

jailbird의 이미지

dgkim wrote:
패킷이 덮어씌워지는 순서가 틀렸습니다.
EtherFrame - IPDatagram - TCPPacket - Data
위와 같이 IP위에 TCP가 올라갑니다.

하~ 감사합니다. 이 내용은 얼핏 지나가면서 몇번 읽은 기억이 나네요. 읽는 순간 얼굴 시뻘개지면서 '맞아! 이런것도 몰랐다니...' @.@

dgkim wrote:
그리고 라우팅에 대한 이해는 제대로 알고 계신 것입니다.

휴~ 엄하기로 소문난 교수님께 듣기 어려운 칭찬 한 마디 들은 기분이었습니다. 10여년 전 학창시절이 새삼 그리워지네요. 감사합니다. 시험쳐서 붙은 기분입니다.

dgkim wrote:
이더넷의 프레임의 주소가 바뀌는 것은 맞는데..
다시 생각하실 내용은..
패킷을 다시 생성합니다.
그래서 라우터가 패킷을 받으면 Ethernet을 때어낸다음
다시 나갈 때 다시 만들며, 인터넷이란 것이 Ethernet으로만 이루어진 것이 아니기에
들어온 이더넷 프레임은 나갈 때 Atm Cell로 나갈 수도 있죠..( 맞나?)

첫번째 질책이 기초력 테스트 낙제였다면, 이번 질책은 응용력 테스트 낙제네요. ^^; 집안에서 이더넷 카드만 만지작거리고 있다보니 다른 상황에 대해서는 상상조차 하지 못했네요. 감사합니다.

이상을 토대로 다음과 같이 라우팅에 대해 수정해보았습니다.
단, 상황을 단순화하기 위해 모든 네트워크 인터페이스는 이더넷카드로 제한하였습니다.

1) Desktop   [0A|0B][192.168.0.2|x.y.z.2][1234|80][Data1] 생성, 발송 
2) Router    [0C|0D][192.168.0.2|x.y.z.2][1234|80][Data1] routing, 발송 
3) KLDP      [0D|0C][x.y.z.2|192.168.0.2][80|1234][Data2] 생성, 발송 
4) Router    [0B|0A][x.y.z.2|192.168.0.2][80|1234][Data2] routing, 발송 
5) Desktop   패킷 수신 및 웹브라우저에 표시 

헤더 순서를 말씀하신 것과 같이 바꾸었고, 앞서의 변경이란 단어를 routing이라는 단어로 바꾸었습니다. 이는 이더넷 프레임을 버리고 상황에 따른 새로운 프레임을 기준으로 패킷을 재생성하는 과정을 염두에 두니 적절한 단어가 없어서요.
휴~ 이정도면 재시 합격인가요?
jailbird의 이미지

읽은 문서들 중에 NAT의 과정을 이해하는데 가장 도움이 되었던 글이 다음과 같은 부분입니다.

http://www.vicomsoft.com/knowledge/reference/nat.html wrote:
When a packet is received from an internal client,

Incoming packet received on non-NAT port
Look for source address, port in the mapping table
If found, replace source port with previously allocated mapping port
If not found, allocate a new mapping port
Replace source address with NAT address, source port with mapping port

Packets received on the NAT port undergo a reverse translation process:

Incoming packet received on NAT port
Look up destination port number in port mapping table
If found, replace destination address and port with entries from the mapping table
If not found, the packet is not for us and should be rejected


이 글을 토대로 아래와 같은 가정 아래에서 패킷의 변화를 상상해보았습니다.
* 모든 네트워크는 ethernet frame을 사용한다고 가정
* Desktop:1234에서 KLDP:80로 패킷을 처음 보내는 경우

1) Desktop   [0A|0B][192.168.0.2|x.y.z.2][1234|80][Data1] 생성, 발송 

2) SNAT     내부 net에서 비어있는 임의포트(2345)에서 패킷 수신
            -> maping table에서 source address, port 검사 -> not found -> 
            mapping table에 새 mapping address, port(3456) 할당 
            #1[192.168.0.2:1234|x.y.z.1:3456]

             [0A|0B][x.y.z.1|x.y.z.2][3456|80][Data1] source를 새 mapping address, port로 변경
             [0C|0D][x.y.z.1|x.y.z.2][3456|80][Data1] POST-routing 및 발송

3) KLDP      [0D|0C][x.y.z.2|x.y.z.1][80|3456][Data2] 생성, 발송 

4) DNAT     외부 net에서 이미 NAT에 매핑된 포트(3456)에서 패킷 수신
            -> maping table에서 destination port 검사 -> found #1

             [0B|0A][x.y.z.2|x.y.z.1][80|3456][Data2] PRE-routing
             [0B|0A][x.y.z.2|192.168.0.2][80|1234][Data2] destination을 mapping address, port로 변경, 발송 

5) Desktop   패킷 수신 및 웹브라우저에 표시

mapping table은 어떻게 구성되어있는지 전혀 몰라 임의로 만들었으며
[source address:port|NAT-outer address:port]로 설정했습니다.
routing 순서는 snat, dnat에서 각각 post-, pre-routing 한다고 해서 임의로 순서에 넣었습니다.

머리를 쥐어짜가며 만들어본 결과인데 실제로 이런 방식으로 작동하진 않겠죠? 뭔가 많이 부족할 듯합니다. 조언을 들을 수 있을까요?

박영선의 이미지

NAT는 말 그대로 네트웍주소를 바꾸는겁니다.

레이어3,4에서 일어나는 일이니 레이어2의 맥어드레스까지 언급할 필요는 없습니다.

맥은 랜에서만 씁니다.

WAN에서 IP패킷이 IP를 기준으로 라우팅되다가 도착지에 도착하면 라우터가 맥을 달아주어서 해당 호스트까지 찾아가는거죠.

단순하게 생각하세요.

Jailbird님께서 그려놓으신 그림을 참조하도록할께요...

여기서 NAT에 필요한것은 TCP헤더에있는 소스/데스티네이션포트, IP헤더에있는 소스/데스티네이션 아이피입니다.


              [test_bsd]--------------------[FreeBSD ROUTER]----------------------(Internet)----------------[kldp.org] 
              1.1.1.11(rl0)           1.1.1.1(dc1)    200.100.10.1(dc0)                                   211.39.143.146 
1.1.1.11에서 lynx를 이용하여 kldp.org 웹서버에 접속한 내용을 캡쳐한겁니다.

전부터 한번 확인해보려던건데 이제 하게됐네요.

지금 사무실에서 사용중인 프비머신에서 뜬겁니다.(프비5.1 ipfw,natd 이용)

캡쳐한게 보기 안좋아서 순서대로 번호를 붙였습니다.

그럼 차근차근 번호대로하면...

1. 1.1.1.11에서 kldp.org에 lynx 로 접속하였습니다.
   출발지가 1.1.1.11:49208 목적지가 211.39.143.146:80 인 SYN패킷을 만들어 디폴트라우터인 1.1.1.1 에 던저줘서 해당인터페이스인 dc1이 받은겁니다.

2. NAT 설정에 따라 dc1에서 받아온 패킷들은 모두 natd 대몬에 전달되어 IP,port 정보를 맵핑하여 저장하고, 공인망에서도 라우팅될수있도록 출발지정보가 바뀌어서 라우터로 보내집니다.

3. 외부인터페이스에서 kldp.org에서 SYN,ACK 패킷이 왔습니다.

4. 나갈때 저장했던 IP,port 정보를 이용하여 도착지 정보를 변경하여 내부인터페이스인 dc1을 통해 SYN,ACK 패킷을 보냅니다.

5. TCP연결 3단계중 마지막 ACK 패킷을 전송합니다.

6. 이후 HTTP연결을 시작합니다.

7. TCP연결과 마찬가지 과정을 거쳐서 패킷의 출발지를 변조합니다.

8~18 생략

[root: /root]# tethereal -i dc0 -l -t a host 211.39.143.146
Capturing on dc0
2  02:10:44.574812 200.100.10.1 -> 211.39.143.146 TCP 49208 > http [SYN] Seq=637684557 Ack=0 Win=65535 Len=0
3  02:10:44.576283 211.39.143.146 -> 200.100.10.1 TCP http > 49208 [SYN, ACK] Seq=3098057345 Ack=637684558 Win=5792 Len=0
7  02:10:44.580513 200.100.10.1 -> 211.39.143.146 TCP 49208 > http [ACK] Seq=637684558 Ack=3098057346 Win=33304 Len=0
8  02:10:44.580592 200.100.10.1 -> 211.39.143.146 HTTP GET / HTTP/1.0
9  02:10:44.582156 211.39.143.146 -> 200.100.10.1 TCP http > 49208 [ACK] Seq=3098057346 Ack=637684750 Win=5792 Len=0
10 02:10:44.582659 211.39.143.146 -> 200.100.10.1 HTTP HTTP/1.1 302 Found
11 02:10:44.582703 211.39.143.146 -> 200.100.10.1 TCP http > 49208 [FIN, ACK] Seq=3098057793 Ack=637684750 Win=5792 Len=0
16 02:10:44.586455 200.100.10.1 -> 211.39.143.146 TCP 49208 > http [ACK] Seq=637684750 Ack=3098057794 Win=33080 Len=0
18 02:10:44.594469 200.100.10.1 -> 211.39.143.146 TCP 49208 > http [FIN, ACK] Seq=637684750 Ack=3098057794 Win=33304 Len=0
[root: /root]# tethereal -i dc1 -l -t a host 1.1.1.11
Capturing on dc1
1  02:10:44.573104     1.1.1.11 -> 211.39.143.146 TCP 49208 > http [SYN] Seq=637684557 Ack=0 Win=65535 Len=0
4  02:10:44.577286 211.39.143.146 -> 1.1.1.11     TCP http > 49208 [SYN, ACK] Seq=3098057345 Ack=637684558 Win=5792 Len=0
5  02:10:44.577452     1.1.1.11 -> 211.39.143.146 TCP 49208 > http [ACK] Seq=637684558 Ack=3098057346 Win=33304 Len=0
6  02:10:44.579066     1.1.1.11 -> 211.39.143.146 HTTP GET / HTTP/1.0
12 02:10:44.583344 211.39.143.146 -> 1.1.1.11     TCP http > 49208 [ACK] Seq=3098057346 Ack=637684750 Win=5792 Len=0
13 02:10:44.584337 211.39.143.146 -> 1.1.1.11     HTTP HTTP/1.1 302 Found
14 02:10:44.584363 211.39.143.146 -> 1.1.1.11     TCP http > 49208 [FIN, ACK] Seq=3098057793 Ack=637684750 Win=5792 Len=0
15 02:10:44.584689     1.1.1.11 -> 211.39.143.146 TCP 49208 > http [ACK] Seq=637684750 Ack=3098057794 Win=33080 Len=0
17 02:10:44.592515     1.1.1.11 -> 211.39.143.146 TCP 49208 > http [FIN, ACK] Seq=637684750 Ack=3098057794 Win=33304 Len=0

[root: /root]# ifconfig -a
dc0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
        inet 200.100.10.1 netmask 0xffffffc0 broadcast 218.49.114.255
        ether 00:02:e3:07:e5:41
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
dc1: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
        inet 1.1.1.1 netmask 0xffffff00 broadcast 1.1.1.255
        ether 00:02:e3:08:65:49
        media: Ethernet autoselect (100baseTX)
        status: active

test_bsd# ifconfig -a
rl0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        options=8<VLAN_MTU>
        inet 1.1.1.11 netmask 0xffffff00 broadcast 1.1.1.255
test_bsd# /usr/local/bin/lynx 211.39.143.146

캡쳐한 원본은 양이 많아 파일로 첨부합니다.

댓글 첨부 파일: 
첨부파일 크기
Plain text icon 0바이트
Plain text icon 0바이트

^^;;

jailbird의 이미지

감사합니다. 덕분에 많은 부분이 명확해졌습니다. 그리고 제가 많은 부분을 얼마나 잘못 이해하고, 기억하고 있었는지 되짚어볼 수 있었습니다. 고물컴 한대 더 옆에 있었을 때 저 tethereal 명령어라도 알았었다면 싶더라구요. 게다가 순서대로 설명까지 해주시니 감사합니다.

박영선 wrote:
NAT는 말 그대로 네트웍주소를 바꾸는겁니다.
레이어3,4에서 일어나는 일이니 레이어2의 맥어드레스까지 언급할 필요는 없습니다.
맥은 랜에서만 씁니다.
WAN에서 IP패킷이 IP를 기준으로 라우팅되다가 도착지에 도착하면 라우터가 맥을 달아주어서 해당 호스트까지 찾아가는거죠.

말씀처럼 NAT만 이해하자고 드니 맥어드레스는 전혀 필요없더군요.
사실 이것을 언급한 까닭은 NAT와 routing가 서로 영향을 미치기 때문입니다. (이 부분은 아래에서 다시 이야기할께요.)
그리고, 아직까지도 routing을 "패킷의 목적지IP를 기준으로 MAC Address를 변경하는 작업"으로 오해(!)하고 있었기 때문입니다. WAN은 MAC이 없다니...., 생각해보면 연결되는 node가 그렇게 많지 않다면 모두 1:1 통신을 하는게 효율적일테고 그러면 MAC이 필요없겠죠.그럼 routing을 "패킷이 나가야 할 NIC을 결정하는 작업 + LAN의 경우 MAC address 수정"이라고 생각하면 맞을까요?

이것 저것 새로 이해한 것들을 바탕으로 위의 예를 아래와 같이 정리해 보았습니다.

    Node                   IP header                          TCP header 
======================================================================================== 
1) [Test_BSD]             [1.1.1.11 -> 211.39.143.146]       [49208 > 80] 
   [FreeBSD Router]       [1.1.1.11 -> 211.39.143.146]       [49208 > 80] <-routing 
2) [FreeBSD Router]       [200.100.10.1 -> 211.39.143.146]   [49208 > 80] <-SNAT 
3) [KLDP.org]             [211.39.143.146 -> 200.100.10.1]   [80 > 49208] 
4) [FreeBSD Router]       [211.39.143.146 -> 1.1.1.11]       [80 > 49208] <-DNAT 
   [FreeBSD Router]       [211.39.143.146 -> 1.1.1.11]       [80 > 49208] <-routing 

휴~ 이즈음에서 기말고사를 한 번 봐야 하겠네요. IP,TCP 헤더는 변함이 없는데도 routing을 넣은 것은 그 순서를 명확히 표시하기 위해서입니다. 아래에서 다시 질문하려구요. 여하튼 이렇게 정리하면 맞을까요? (그러고보니 저번에는 너무 엉터리 답안을 제출했네요. routing위치도 둘 다 틀렸고) (후후.. 그러고보니 설명해주신 1-4번 그대로네요. 틀릴 리도 없겠당.)

이런 저런 생각을 하며 정리하다보니 제가 Port에 대해 제대로 알지 못한다는 것도 확인하였습니다. 하지만, 이 이야기를 시작하면 주제에서 벗어날 듯하여 생략하고 아직도 잘 안풀리는 아래의 문서에 대한 질문 한가지만 할께요.

http://www.netfilter.org/documentation/HOWTO/NAT-HOWTO-6.html 에서 다음의 인용문을 찾아보면,

6.1 Source NAT wrote:
You want to do Source NAT; change the source address of connections to something different. This is done in the POSTROUTING chain, just before it is finally sent out; this is an important detail, since it means that anything else on the Linux box itself (routing, packet filtering) will see the packet unchanged. It also means that the `-o' (outgoing interface) option can be used.

SNAT는 POSTROUTING chain에 있는데, 즉 라우팅을 한 후에 SNAT를 하는데, 그렇기 때문에 패킷의 내용이 변하기 전인 원래상태을 알수 있는 상황에서 제대로 routing을 하게된다는 것이죠. 이러한 사실때문에 SNAT와 routing의 순서가 중요하다고 설명하고 있고요. 그런데, 이 부분이 잘 이해가 안갑니다. SNAT를 먼저 한다고 해도 목적지IP는 건드리지도 않기 때문에 routing에는 전혀 이상이 없을 것이라고 생각되거든요. 뒤이어 나오는 설명에서 이 순서 때문에 -o 옵션이 가능하다고 하는 것은 나름대로 이해가 가더군요. -o 옵션의 의미가 "xxx라는 인터페이스로 나가는 패킷에 규칙을 적용한다."라고 생각하면, routing하기 전에는 패킷이 나갈 인터페이스가 제대로 결정되지 않은 상태일테니 -o 옵션이 제대로 작동하지 않겠지요.
즉, 이 설명을 "라우팅과 SNAT의 순서가 바뀌면 SNAT에서 -o 옵션이 제대로 작동하지 않으니 안된다."라고만 했으면 무리없어 보이는데, "순서가 바뀌면 라우팅도 잘 안된다." 라고 해석되어서 이해가 안간다는 것이죠.

제가 영어실력이 형편없어서 해석을 잘못했나 싶어 그 아래의 비슷한 구문을 갖춘 6.2 Destination NAT도 같은 방식으로 해석해 봤거든요.

6.2 Destination NAT wrote:
This is done in the PREROUTING chain, just as the packet comes in; this means that anything else on the Linux box itself (routing, packet filtering) will see the packet going to its `real' destination. It also means that the `-i' (incoming interface) option can be used.
하지만, 여기서는 DNAT를 먼저 해야 실제로 찾아가야할 목적지의 IP를 routing할 때 알 수 있으니 전혀 무리가 없더군요. -i 옵션도 들어오는 인터페이스에 적용하는 것으로 해석하면, 최소한 LAN환경에서 라우팅을 한 후에는 MAC이 변하니 맞는 말 같구요.

생각끝에 결론은 "라우팅을 할 때는 목적지IP도 참조하지만, 시작점IP도 참조한다."라고 되었는데, 정말 그런가요? 어느 생각이 잘못된 것인지 판단할 수가 없네요. 조언을 기다리겠습니다.

박영선의 이미지

먼저 결론을 내리면 라우터는 목적지아이피만 참고하여 라우팅하는 단순한 기계라는겁니다.

초창기 TCP/IP를 설계했을때는 서로 믿고사는 분위기였다잖아요.

그래서 보안이고뭐고 그냥 서로 약속한대로 패킷을 주고받으면 통신이되는 획기적인 시스템이었는데, 어느날인가부터(특히 케빈미트닉) 해커들이 신뢰를 기반으로 하는 TCP/IP의 약점을 이용하기 시작한거죠.

그래서 라우터들도 좀 더 신경써서 라우팅을 하기 시작한거죠.

가령 외부에서 들어오는 패킷인데 출발지주소가 내부아이피(로컬)인경우라던가, 사설아이피, 멀티캐스트로 예약된 대역등 공인망에서 쓸 수 없는 아이피라면 패킷을 버린다는거죠.

그래서 nat 서버에서 패킷을 공인망으로 내보내기전에 출발지 주소를 공인망에서 쓸 수 있는 아이피로 바꾸어서 내보낸다는겁니다.

그리고 OSI 7 layer 문서를 다시한번 읽어보세요.

SNAT이든 DNAT이든 모두 Layer 3,4 에서 일어나는 일입니다.

NAT에서 조작된 패킷들이 실제 해당 호스트에게 전해지는건 모두 라우터 안쪽의 Layer 2에서 Mac address로 작동하는거니 신경쓸필요 없습니다.

IP레벨이하에서는 스위치와 랜카드들이 알아서 다 하니 뭘 하는지 알 필요가 없습니다.

아...그리고 SNAT랑 DNAT를 너무 복잡하게 생각하시는거같은데 NAT machine 에서 라우팅이란 패킷이 하나 있으면 이걸 외부로보낼까 내부로보낼까, 아니면 죽여버릴까 이것만 판단하면 된다는겁니다.

SNAT는 패킷이 바깥으로 나갈때인데 목적지주소가 이미 있으니 라우팅하는데는 문제가 없는거고(라우터는 목적지주소만 알고있으면 된다고했습니다) 출발지 주소만 공인아이피로 바꿔주면 인터넷을 여행하는데 지장이 없는거죠.

반대로 DNAT는 NAT machine에서 조작해 발송한 패킷의 응답이 되돌아왔을때의 상황이잖아요.

출발지, 도착지모두 공인아이피인 패킷을 원래 패킷운송을 의뢰했던 사설네트웍의 호스트에 돌려주려면 당연히 라우팅 정보를 바꿔줘야하지않겠습니까?

SNAT, DNAT에대한 설명이 나와있네요...
http://www.linuxlab.co.kr/docs/01-03-2.htm

^^;;

jailbird의 이미지

두서없는 글에 세심하게 답변해 주신 점 감사합니다. 다시 이제껏의 글을 읽어보니 처음 시작했던 주제는 이미 해결한 상태이더군요. 박영선님께서 올려주신 첨부파일과 그 설명을 따라 읽으면서 해결된 문제였습니다. 말씀하신 것처럼 라우팅은 생각하지 말고 단지 어떤식으로 패킷이 변했는가를 따라가기만 하면 되었고, 라우팅과의 순서 문제는 NAT-2.4-HOWTO에 그려져 있는 대로만 된다고 생각하면 큰 문제는 없었습니다.

제가 어제 질문으로 올린 글은 주제와 좀 거리가 있는 내용이니 새로 써야 했던 듯해요. 더구나 그 글은 질문하는 내용도 약간 모호한 점이 있네요. 이런 글에까지 자세히 답변해주셔서 감사합니다. 덕분에 제가 정말 알고자 했던 것이-초보자는 자기가 뭘 원하는지도 때로는 잘 모르게 되더군요^.^- "OSI 7 Layer" 안에 들어있다는 것을 알게 되었습니다. 그런데 찾아서 읽다보니 내용도 방대하고 읽고 소화할만한 지식도 부족해서 좀 시간을 두고 접근해야겠다는 결론이 나더군요. 다시 한 번 감사드리며 글을 접습니다. 꾸벅~

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.