문서 전체에서 변경


:%s/변경시킬문자/변경될문자/g


ex) :%s/10/100/g





문서 1번째줄부터 10번째줄까지에서 변경


:1,10s/변경시킬문자/변경될문자/g


ex) :2,25s/10/100/g



'System > Linux,Unix' 카테고리의 다른 글

VI 편집기 명령어 정리  (0) 2018.08.07
명령어 정리  (0) 2018.08.07
Unix의 구조 ( Kernel, Shell)  (0) 2018.08.03
Unix와 Linux의 차이  (0) 2018.08.03
FreeMemory에 대한 이해  (0) 2018.07.17

바이트 순서


바이트 순서는 해당하는 OS 시스템이 내부적으로 데이터를 표현하는 방법을 의미한다.

그렇기 때문에 모든 시스템의 데이터 표현방식이 같지 않다.


표현방식에는 2가지 방식이 존재한다.






Little Endian, Big Endian


시스템이 내부적으로 데이터를 처리하는데 Big-Endian을 사용하느냐 Little-endian을 쓰느냐는 시스템의 CPU에 따라 달라진다.

이것을 호스트 바이트 순서라고 한다.



Little Endian 

Big Endian 

 intel x86

 IBM

 AMD

 ARM

 EDC

 Motorola




0x12345678 의 32비트 데이터를 표현



Big Endian : 0x12 0x34 0x56 0x78


낮은 주소 -> 높은 주소




Little Endian : 0x78 0x56 0x34 012


낮은 주소 -> 높은 주소





그렇기 때문에 빅 엔디안을 쓰는 CPU와 리틀엔디안을 사용하는 CPU가 데이터 통신을 하게 되면 문제가 발생할 수 있다.




네트워크 바이트 순서


네트워크 바이트 순서는 Big Endian 방식만을 사용한다.

따라서 Little Endian을 사용하는 경우  Big Endian 방식으로 데이터를 변경해서 전송해야 하며 수신한 데이터에 대해서 역순으로 조합해야 한다.

또한 포트와 주소는 항상 네트워크 바이트 순서 규칙을 사용하여 소켓 함수를 호출 할 때 지정된다.






바이트 순서 전환


h : host byte order

n : network byte order

l : long(32bit)

s : short(16bit)



일반적으로 4byte의 long  타입은 IP 변환에 사용되며, 2byte의 short 타입은 포트 변환에 사용된다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import socket
 
 
host_port = 0x3456
host_ip = 0x12345678
 
network_ip_order = socket.htonl(host_ip)
network_port_order = socket.htons(host_port)
 
print("CPU is Intel")
print("Host %x" %(host_ip))
print("Network Byte Order %x" %(network_ip_order))
print("Port %x" %(host_port))
print("Network Byte Order %x" %(network_port_order))
 
cs



>>CPU is Intel

>>Host 12345678

>>Network Byte Order 78563412

>>Port 3456

>>Network Byte Order 5634








JAVA


자바에서는 기본적으로 부호없는 정수 (Unsigned int)는 존재하지 않으며 정수를 표현할 때 빅 엔디안을 따른다.


그렇기 때문에 다른 플랫폼에서 사용한 데이터의 네트워크 바이트 순서 전환없이 리틀 엔디안의 데이터를 받는다면, 빅 엔디안으로 변경할 필요가 있다.


(애초에 네트워크 바이트 순서의 빅 엔디안으로 사용하는 것이 좋을 것이다.)


1
2
3
4
5
6
7
8
public static int getBigEndian(byte[] v)throws Exception{
int[] arr = new int[4];
for(int i=0;i<4;i++){
arr[i] = (int)(v[3-i] & 0xFF);
}
return ((arr[0<< 24+ (arr[1<< 16+ (arr[2<< 8+ (arr[3<< 0));
}
}
cs








참고 : http://iblog.or.kr/hungi/it/server/network/2056

'System > Network ' 카테고리의 다른 글

AWS 네트워크 정리 - VPC, Subnet, Routing Table ..  (0) 2020.01.17
브릿지(Bridge)  (0) 2018.09.17
TCP 3-way Handshake vs 4-way Handshake  (0) 2018.05.19
TCP Header 구조체 분석  (0) 2018.05.09
TCP/IP , OSI 7 Layer  (0) 2018.04.01


3-Way Handshake


서버와 클라이언트간의 TCP 연결 단계에서 신뢰성 있는 연결을 하게 된다.

이 때 데이터의 정확한 전송을 보장하기 위한 세션을 성립(Establish) 단계를 위해 3-Way Handshake 방식을 사용하게 된다.





1-1)client는 TCP SYNchronize 패킷을 server로 전송합니다.

1-2)server는 client의 SYN을받습니다.
2-1)server는 SYNchronize-acknowledgement를 보냅니다.
2-2)client는 server의 SYN-ACK를 수신합니다.
3-1)client는 ACKnowledge를 보낸다.
3-2)server는 ACK를 수신합니다.

 -> TCP 소켓 연결이 설정.  




4-Way Handshake


4-way handshake는 클라이언트와 서버의 통신을 종료하기 위해서 사용된다.



1) 클라이언트가 연결을 종료하겠다는 FIN패킷을 전송


2) 서버는 세그먼트A를 확인 후 클라이언트에게 ACK패킷을 발송한 후, 자신의 통신이 끝날 때까지 대기(TIME-WAIT)한다. 이때, 클라이언트는 서버의 FIN패킷을 대기(FIN-WAIT-2)한다.


3) 서버의 통신이 끝나서 종료할 준비가 되었다면, 클라이언트에게 FIN패킷 전송한다.

4) 클라이언트는 서버에 ACK패킷을 전송하고 서버는 ACK 패킷을 받는다.




- 서버에서 FIN패킷을 발송하기 전에 전송한 패킷이 라우팅 지연이나 패킷 유실로 인한 재전송 등으로 FIN패킷보다 늦게 도착하는 상황이 발생할 수 있다.

- 클라이언트가 세션을 종료한 후, 뒤늦게 도착하는 패킷이 있다면 이 패킷은 드랍되고 데이터는 유실된다.

- 이런 현상에 대비하여 클라이언트는 서버로부터 FIN패킷을 수신하더라도 일정시간(디폴트 240초) 동안 세션(session)을 남겨놓고 잉여 패킷을 기다리는 과정을 거치는데, 이 과정을 TIME-WAIT라고 한다.









※ 왜 3 way-handshake 와 4-way handshake 방식을 사용할까?


: TCP는 4layer에서 수행되며 신뢰성 있는 통신이다.  클라이언트와 서버간의 연결/종료는 데이터의 정확한 전달만큼 중요한 단계이다.


클라이언트-서버간 서로 SYN과 ACK 패킷을 통해 연결 요청에 대해 물어보고, FIN과 ACK 패킷을 통해 서로간의 통신중단에 대해 물어보는 과정이다.



 









참고: http://www.tcpipguide.com/free/t_TCPConnectionEstablishmentProcessTheThreeWayHandsh-3.htm









TCP Packet(Segment) 




1)  Sourse/Destination Port Number ( 16 비트)             


 - 데이터를 생성한 애플리케이션에서 사용하는 포트번호

 - 목적지 애플리케이션에서 사용하는 포트번호



2) Sequence number (32 비트)             


 - 전송되는 데이터의 가상 회선을 통해 데이터의 모든 바이트에는 고유한 일련번호가 부여된다.

 - 네트워크가 불안하여 패킷을 분실, 지연 등으로 세그먼트가 순서가 어긋나게 도착 할 수 있기 때문에 sequence number를 이용하여 데이터를 올바른 순서로 재배열 할 수 있다.



3) acknowledgement number (32 비트)             


- 수신하기를 기다리는 다음 바이트 번호 

- 마지막 수신성공 번호 +1 .. 순서로 할당



4) HLEN = Header Length (4 비트)             


헤드의 길이를 32비트 단위로 나타낸다. 최소 필드 값은 5 (5 * 32 = 160bit or 20Byte )  최대 값 15 (15 * 32 = 480bit or 60byte)


5) 예약 (6 비트)             


- 추후 사용을 위한 예약된 필드


6)  Flag Bits 


- 6개의 플래그 비트

TCP 세그먼트 전달과 관련되어 TCP 회선 및 데이터 관리 제어 기능을 하는 플래그


CWR :(Congestion Window Reduced) – 혼잡 윈도우 크기 감소

- ECN :(Explicit Congestion Notification) – 혼잡을 알림

- URG(Urgent) : Urgent Pointer 필드가 가리키는 세그먼트 번호까지 긴급 데이터를 포함되어 있다는 것을 뜻한다.

  이 플래그가 설정되지 않았다면 Uregent Pointer 필드는 무시되어야 한다.

- ACK(Acknowledgment) : 확인 응답 메시지

- PSH(Push) : 데이터를 포함한다는 것을 뜻한다.

- RST(Reset) : 수신 거부를 하고자 할때 사용

- SYN(Synchronize) : 가상 회선이 처음 개설될 때 두 시스템의 TCP 소프트웨어는 의미 있는 확인 메시지를 전송하기 위해  일련 번호를서로 동기화해야 한다.

- FIN(Finish) : 작업이 끝나고 가상 회선을 종결하고자 할 때 사용



7)  Windows Size(16 비트)


- 흐름제어를 위해 사용하는 필드



8)  CheckSum (16 비트)


TCP 세그먼트의 내용이 유효한지 검증하고 손상 여부를 검사 할 수 있다.





9)  Urgent Pointer (16 비트)


- TCP 세그먼트에 포함된 긴급 데이터에 대한 마지막 바이트에 대한 일련번호

 현재 일련번호(sequence number)로부터 긴급 데이터까지의  바이트 오프셋(offset)
        . 해당 세그먼트의 일련번호에 urgent point 값을 더해 긴급 데이터의 끝을 알수있음







참고자료: http://www.ktword.co.kr/abbr_view.php?m_temp1=1889

OSI 7 Layer (Open System Interconnection) 

기종이 다른 컴퓨터간의 통신시 네트워크 구조에 상관없이 개방형 통신을 할 수 있도록
국제표준화기구(ISO)에서 개발한 모델.
네트워크를 이루는 구성요소들을 계층적 방법으로 나누고 각 계층의 표준을 정한 것.

OSI 모델의 목적은 기본적인 하드웨어와 소프트웨어의 논리적인 변경없이 시스템간의 통신을 개방하는 것.




TCP/IP 4 layer 가 먼저 나왔으며, 향후 OSI 7 layer로 발전하였다. (프로토콜에서 모델로 발전)

그렇다고 해서 TCP/IP 가 OSI 계층의 기능을 수행하지 못하는 것은 아니다.


해당 층에 수행하는 기능을 각각 비교해보자.



<OSI 7 Layer 와 TCP/IP 4 Layer>










응용계층 


네트워크 접근, 서비스 제공



응용계층


  사용자가 네트워크에 접근할 수 있는 계층.

  telnet, http, ftp, ssh .. 


 표현계층


이해할 수 있는 포맷 변환


  입출력 간 데이터를 하나의 표현 형태로 변환

 jpeg, gif, mpg .. 


 세션계층


네트워크의 질서 제어


  사용자 간의 포트연결이 유효한지 확인한다.

  세션 확인


  SSL, TLS .. protocol.




 전송계층


게이트웨이

  전송계층


 종단 대 종단 간 제어와 에러를 관리한다.


 패킷들의 전송이 유효한지 패킷들을 확인하고, 실패한 패킷을 다시 보내는 신뢰성 있는 전송을 보장

 머리말(header)에는 세그먼트가 포함. 


 tcp/udp protocol



 네트워크계층


장비: 라우터


 네트워크계층


 데이터 주소와 경로의 흐름을 제어한다. (ex - ping)

 패킷을 목적지로 전달할 책임을 갖는다.


 

데이터링크계층


장비 : 스위치,브리지


물리계층


 이더넷, 토큰 링 등 네트워크 사이의 데이터 전송 순서를 정함.

 

 OSI 7layer에서는 물리적 매체 전송순서와 데이터 접근 방법으로 나누어 계층을 구분했다.



 

물리계층


장비: 허브





-> l4  장비로 스위치를 두는 경우도 있는데, 3계층에서 온 트래픽을 분석하여 서비스 종류를 구분하는 역할






허브포트에 전기 신호가 도착하면 신호가 들어온 포트를 제외한 모든 포트에 신호를 전달. 각자 터미널 들이 그 신호를 받아 들일것인지 아닌지 결정.



스위치: 허브와 같이 포트에 들어온 신호를 다른 포트에 전송하는 기능

         허브는 모든 포트에 전송을 하지만 스위치는 프레임을 필터링 함

         MAC(물리주소, 랜카드 하드웨어)주소를 이용, 데이터를 보내고자 하는 포트에만 신호 전달

         충돌 도메인이 나뉘어짐



브리지: 개의 세그먼트를 연결하고 패킷을 전송하는 장비


라우터: Routing protocol을 사용하여 IP Packet이 원하는 목적지까지 원할하게 갈 수 있도록 경로를 정해주는 역할을 하는 장비를 지칭하는 것.

         

-  스위치와 브릿지, 허브를 통해서 LAN을 구성 후 외부와 연결하기 위해서는 라우터가 필요 

-  한 네트워크에서 다른 네트워크로 패킷을 전달하기 위해 사용

-  3계층이기때문에 IP주소를 사용해서 전달
-  라우터가 다른장비와 틀린점은 충돌도메인과 브로드캐스트 도메인을 분리



게이트웨이 : l4 이상에서만 작동하며, 퓨터 네트워크에서 서로 다른 통신망, 프로토콜을 사용하는 네트워크 간의 통신을 가능하게 하는 컴퓨터나 소프트웨어를 두루 일컫는 용어, 즉 다른 네트워크로 들어가는 입구 역할을 하는 네트워크 포인트이다. 특정 장비가 아니라 네트워크를 할때 노드에서 어디로 전송해야 할지를 나타내는 곳. 라우터나 스위치등의 장비가 될 수 있음







방화벽


- 방화벽은 네트워크 packet 중 network protocol의 tcp/ip layer에서 ip와 port 정보를 갖고 있으며 방어한다.


 · 외부 네트워크(인터넷)로부터 내부 시스템을 보호

  - 문제 있는 트래픽이 들어오는 것을 제한(필터링)하는 일종의 라우터

 · 방화벽의 설치위치: 외부망과 내부망(사내망) 연결통로에 설치

 · 구현방식: 대부분이 라우터로써, 통합 구현



=> 네트워크 상에 흘러다니는 패킷을 검사하고 외부의 접근은 제한한다.




방화벽 역할


 · 침입 차단(Firewall) 역할

  - IP주소 포트에 의거한 침입 차단 기능 수행

 · 침입방지(IPS) 역할

  - 다양한 위협에 대처하기 위해, 많은 다기능 침입방지 기능들이 추가적으로 수행됨

 · 가상사설망(VPN) 역할


  - 정보의 비밀성 무결성에 촛점을 두고 수행








인바운드 / 아웃바운드 규칙


인바운드 

 - 서버 내부로 들어오는 여러 정보 ( IP / port / host / protocol / packet ....)

 - windows 기본 설정 ( 모든 접속 차단)

 - 컴퓨터로 들어오기 시작하는 모든 데이터



아웃바운드 

 - 외부로 송출하려는 정보

 - windows 기본 설정 ( 모든 접속 허용)

 - 컴퓨터에서 나가기 시작하는 모든 데이터


Proxy



proxy (프록시)는 단어 그대로 '대리인'의 역할을 하는 서버이다. 


웹 환경에서 프록시 서버의 역할은 웹 클라이언트와 웹 서버 사이에서 요청한 데이터를 전달하는 것입니다.


이 때 프록시 서버는 웹서버에서 가져온 데이터를 웹클라아인트에 전송한 후 캐시에 데이터를 저장합니다.


그리고 웹 클라이언트가 같은 데이터를 요청하면 캐시에서 해당 데이터를 보냅니다. 이를 통해 클라이언트에게 빠르게 필요한 내용을 보여줄 수 있겠죠.

             





Proxy의 목적


여러가지 목적이 있지만 크게 다음과 같은 2가지 목적으로 사용됩니다.


(1) 속도 : 캐시를 사용하기 때문에 리소스에 대한 접근이 빠릅니다. 프록시서버에서는 자주 가는 웹사이트에 대한 리소스들이 캐시에 쌓여있고 웹 서버에서 직접 가져오는 것보다 좀 더 빠른 속도로 접근할 수 있습니다.


(2) 보안 : 익명의 사용자가 서버에 접근하는 것을 막을 수 있습니다. 프록시 서버는 요청 서버의 대리인의 역할을 수행함으로써 외부 서버망으로의 접근을 막을수 있습니다. 







Proxy 서버의 종류




1. forward Proxy


- 가장 일반적으로 사용하는 proxy Server 입니다. Proxy 서버를 클라이언트와 원격 서버에 있는 리소스 사이에 위치 시키는 방법입니다.




-> 일반적으로 사내망 (Private Network) 에서 외부로 나갈 때 사용하는 프록시입니다.





2 Reverse Proxy


- 프록시 서버를 인터넷 혹은 인트라넷 리소스 앞에 위치 시킵니다.

- 이 방식을 사용한다면 클라이언트가 프록시 서버에 연결되었다는 것을 알지 못합니다.

- 보안의 이유가 가장 큽니다. 예를 들어 내부망에 웹 데이터를 요청하여 내부망에 접근하였다면 DB 데이터 혹은 파일 서버에 있는 데이터의 접근 또한 가능하게 될 것입니다. 

 









데이터를 가져오는 과정은 다음과 같습니다.


(1) 클라이언트 1은 웹서버에 데이터를 요청합니다.

(2) 프록시 서버에서 데이터를 우선 요청하고. 캐쉬에 데이터를 저장한 후 클라이언트에게 데이터를 전송합니다.

(3) 클라이언트 2,3이 같은 데이터를 요청한다면 프록시 서버는 서버에 요청하지 않고 캐쉬에 있던 데이터를 가져와서 전송합니다.






+ Recent posts