Network/이론

네트워크 이론 - 4

Glory-L 2022. 9. 5. 12:57

※ TCP 

 

1) TCP header =  기본 20 byte + 옵션 40 byte = 60 byte [MPTCP]

 

* src port  - dst port

  client   ----> server [ src port : random port or dst port : well known port 일 경우에 client에서 server에게 보내는 트래픽] 

   

  server   ----> client [ src port : well known port or dst port : random port  일 경우에 server에서 client에게 보내는 트래픽] 

 

============================================================================================

 

TCP 순서 번호 

 

1. 조각화 -> 재조립 과정 

 

2. 수신 확인 응답을 한다. = ACK 라는 신호로 확인 = 형식 > 순서 번호 + 1

ex) 57 + 1 = 58로 보낸다. 

 

3. 재전송 요구 = NAK , 다시 받고자 하는 순서 번호 

 

4. TCP flag 종류 : syn(동기화), ack(확인받는) , rst(리셋) , urg(긴급한) , fin(끝내는) , psh(push) 등이 있다. 

 

※ 과정 flag

 

연결 설정(syn flag, ack flag) - 연결유지(ack) - 연결해지(fin, ack)

 

1) 연결 설정 [3handshake] / [4handshake]

 

client ---- syn flag[www tcp 80번] + 순서번호 초기화  ----->  server 전달

 

case 1) 서버 측이 바빠서 수신을 못하는 경우

client <--------- rst flag [정상적인 요청이 있었을 때 정상적인 종료를 요구] ----- server 

 

case 2) 정상적으로 서버가 수신한 경우 

client <--------- ack + window size ----- server 

 

 

client ---------------- ack -------------------> server

 

-> 3 handshake 과정 끝 , 이 과정이 끝난 상태를 establish 상태라고 한다. 

 

window cmd에서도 명령어로 확인 가능하다.

 

client ---- syn flag[www tcp 80번] + 순서번호 초기화  ----->  server

 

client <--------- ack + window size ----- server

 

client ---------------- ack -------------------> server -> 의도적으로 이 신호를 보내지 않는다면? 

 

= 마지막 신호가 올 때까지 server에서 기다린다. 3handshake가 안된 상황 = half open -> DOS 상태(Deny Of Service)

 

* DDOS : 여러명이서 이 마지막 신호를 보내지 않는 보안 공격, Syn attack이라고도 불린다. 

 

1. 이러한 상황을 해결하기 위한 방법

 

1) 보안 패치

 

2) cookie 정보를 사용한다. client <--------- ack + window size ----- server [cookie 정보를 같이 보낸다.] 

* cookie : 앞의 통신했던 flag들을 담아둔다. 따로 ack flag를 보내지 않고도 정보를 찾을 수 있다.  

 

 

3) FW의 intercept 기능을 사용한다. 

 

방화벽의 방식이 여러가지 존재하는데 모든 세션이 중간에 방화벽을 거쳐가게 하는 방식을 inline mode라 한다. 많은 패킷을 쓰고 있는 server의 경우는 이 방식으로 할 수 없고 mirror mode를 이용해야 한다.

 

이는 같은 대역(switching)에 서버 한 대를 더 두고 중간에 방화벽을 두지 않고 운영한다. 이때 통신을 하면 스위치 장비가 mirror mode인 경우 나가고 들어오는 port를 관리자가 지정한 것만 copy 해서 같은 대역에 있는 서버에 보낸다. 미러모드가 적용되면 수신만 되기 때문에 핑이 들어오기만 하고 나가지 못한다. 따라서 계속 같은 스위치 대역의 서버에 계속 저장되고 wireshark와 같은 툴로 뽑아서 확인이 가능하다.

 

* FW의 intercept : 방화벽이 in line mode로 설치가 되어 모든 세션을 모니터링 하다가 half open의 임계치가 넘어가면 Client를 공격자로 간주하여 Client와 Server쪽으로 fin flag를 보내어 강제로 종료시키는 것

 

 

* window size : 한번에 수신 가능한 [ 처리 가능한] 버퍼의 크기를 의미한다. window size 이상의 데이터를 보낸 경우 drop 시킨다. 사이즈를 늘렸다 줄였다 하면서 흐름 제어도 가능하다.

 

 

2) 연결해지(fin, ack) [3handshake] / [4handshake]

 

클라이언트쪽에서 할 수도 있고 , 서버쪽에서도 할 수 있다. 

 

3handshake

 

A  ------- fin flag -----------> B       : A는 송신 버퍼를 회수   |    B는 수신 버퍼를 회수 

A  <------ ack + fin flag ----------- B   : A는 수신 버퍼를 회수   |    B는 송신 버퍼를 회수 

A  ------- ack flag -----------> B , 종료    

 

4handshake

 

A --------- fin ----------> B      A 송신 버퍼 회수 

A <------- ack ----------- B     B 송신 버퍼 회수 

<<<데이터 전송 <<<

A <--------- fin ---------- B    A 수신 버퍼 회수

A --------- ack ----------> B  B 송신 버퍼 회수 

 

 

========================================================================

 

연결 유지 

 

※ 수신 성공

A ----- seq 57 ---------> B

A <---- ack= 57 + 1 ------ B

 

※ 수신 실패 

A ----- seq 57 ---------> B

A <---- nak = 57 재전송------ B [ 수신 자체가 안된 상황]

 

※ 수신 오류가 발생

checksum 실시 - 만약 1101이라는 신호가 왔을 때 1의 보수를 만들기 위해 수신하는 쪽에서 1의 보수 계산해서 전부 더했을 때 1이 나오는지 확인 후, 재전송을 요구한다. -> error control

 

-> TCP와 IPv4 는 필수로 이 과정이 실시 되어야 하고 UDP는 옵션이며 IPv6 기능이 삭제되었다.  TCP는 오류가 생기면 재전송을 요구하고 UDP는 재전송이 없고 상위 계층에 알려준다. 

 

 

 

=================================================================================

 

window size 합의를 한 후에 순서번호를 할당하여 segment를 순서대로 전송한다. 

이때 window size 만큼 전송 받고 나면 이 수신한 데이터를 상위 계층으로 올려보내고 

송신자에게는 그 다음을 전송하라고 ack를 보낸다. [seq +1]

 

* ack 전송을 할 때 하나 수신하고 ack 보내고 하는 식이 아니라 누적 ack의 방식으로 사용된다. 

 

중간에 수신을 못한 것이 생기면 , 수신 못한 것을 보내라고 알린다. nak = 수신 못한 seq

알렸는데도 수신 못한 데이터를 받지 못하면 다시 수신 못했다고 알린다. 이때 쓰이는 flag = duplicate ack

duplicate ack가 3번 발생되면 이전에 수신한 segment는 폐기한다. 

 

수신한 segment를 전부 폐기하고 처음부터 다시 하는 경우 

 

1. dup ack 3번 발생

 

2. RTO (retransmission time out) [재전송 시간 만료] ex) 30초로 설정되었다면 30초 뒤에는 처음부터 다시 한다. 

 

 

※ psh [ push ] flag :  모든 segment가 수신 완료될 때까지 기다리지말고 빨리 처리하도록 지시 , 수신 버퍼가 찰 때까지 기다리지 말고, 이미 수신한 것만 상위 계층으로 올려보낸다. 

 

 

※ urg[urgent] flag :  뒤에 따라오는 urgent pointer(어디서부터 어디까지가 급한 구간인지를 가르킨다.) 가 유효하다는 것을 알린다. 

 

* congestion control

                   지수적 증가 = slow start 구간 SS 구간 

                   1segment에서 시작해서 지수적 증가를 한다. [ss구간]

                   duplicate ack가 한번 발생되면 승수적 증가 = congestion avoidance 구간 = CA 구간

                   dup ack 가 3번 발생되어지거나 RTO가 다 된 경우 

 

1) tahoe는 1 segment까지 전송 속도를 떨어뜨리고 그 지점에서 다시 시작 

 

2) reno는 최종 segment의 절반까지 전송 속도를 떨어뜨리고 그 지점에서 다시 시작 

 

RTO 시간은 2배로 증가한다. 

 

 

=======================================================================================

 

※ L3 network 계층 , ip 계층 : 논리적 연결 : end to end 연결 -> IPv4 address를 사용한다. 

 

* ip 주소를 교환하는 행위 = routing

 

* router = routing protocol[주소 교환, 경로 연산]에 맞춰 routing[ip lookup] 해주는 장비 

 

* ip lookup = 수신한 패킷의 목적지 주소를 보고, 내 routing table에 있는지 확인, 있다면 지시된 방향으로 보내기 

 

1. 주소광고(내 주소 알려주고) + 주소학습(상대방 주소 알아가고)

-> 주소 테이블 = 친구 목록 = routing table = ip table

 

2. 최적 경로 연산 

 

2 - 1 bellman ford algorithm 방식 -> distance vector routing protocol : RIP, igrp 등등 

2 - 2 dijkstra algorithm 방식 -> link state routing protocol : OSPF, ISIS ....

 

* bellman ford algorithm = distance로 연산하는 것이 일반적

 

ex)

네이버 지도 길찾기 [거리 = 벨먼 포드 알고리즘] -> seed metric [ km ] 

지하철 어플 [ seed metric = 지하철 역 수 ]

RIP [라우터 수]

 

* dijkstra algorithm = link state

 

ex)

네이버 지도 길찾기 [시간 = 다익스트라 알고리즘] -> seed metric [ 도로 혼잡도 ]

지하철 어플 [ seed metric = 환승역 수 , 환승 시간 ]

OSPF [banwidth = cisco]

 

* 스위치 구분 

 

L7 스위치 = application

L4 스위치 = port 서비스, session 인식 ---> QoS 장비 

L3 스위치 = routing, ip lookup 

L2 스위치 = mac table 구축 

 

 

======================================================================================

 

IPv4 address, ICANN, public adress + private address [RFC 1918에 등록되어 있다.]

 

private address [ 내부용 ]  --> public address [ 외부용 ]  ==> NAT

 

IPv4 : 32bit 주소 체계, 2^32 약 43억개로 10진수 표기하지만 연산은 2진수로 한다. 

 

IPv6 : 128bit 주소 체계, 2^128 엄청 많은 개수,  16진수 표기하지만 연산은 2진수로 한다. 

 

IPv4 --> IPv6 변경 이유 

 

1. IPv4 고갈 

 

2. IPv4 문제점 [ 1. checksum의 중복 실행 , L2 체크섬하고 또 L3에서 체크섬...계속 한다.] 때문에 IPv6에서는 삭제되었다. 

 

3. ipv4 당시에는 fixed network -> ipv6 넘어오면서 mobile network에 대한 고려가 필요했다.[이동성 관리]

 

* 이동성 관리 = 논리적 주소 + 물리적 주소 , 둘다 알고 있을 때 이동성 관리가 가능해진다.