정의
데이터가 원하는 목적지에 도달할 수 있도록 인터넷에서 사용하는 표준 프로토콜이다.
TCP/IP는 4계층으로 나뉜다.
- 네트워크 액세스 계층
- 인터넷 계층
- 전송 계층
- 응용 계층
네트워크 액세스 계층
IP 데이터그램을 실제로 전달하는 서브 네트워크를 의미한다. 즉, 상대 측에서 받은 데이터를 인터넷 계층으로 전달한다.
네트워크 액세스 계층은 보통 이더넷을 이용해서 데이터를 보낸다.
이더넷 프레임 구조
- Preamble (7byte)
: 수신측에서 하드웨어 비트 동기를 맞추기 위한 준비 신호이다.
- SFD (Starting Frame Delimiter, 1byte)
: 다음 바이트 열이 프레임의 시작을 알린다.
- DA (Destination Address, 6byte)
: 목적지의 MAC 주소이며, 앞의 3byte는 카드회사 식별코드, 나머지 3byte는 개별적인 목적지 식별용 NIC이다.
- SA (Source Address, 6byte)
: 송신측의 MAC 주소이며, 자신의 주소를 ROM에 기록한다.
: 또한, 초기화 시 ROM에서 읽어 레지스터에 저장하고, 프레임 송신 시 이 레지스터를 읽어 프레임의 SA에 삽입한다.
- EtherType (2byte)
: MAC 프레임 다음의 데이터 부분에 상위 프로토콜의 종류를 표시한다.
: 만약 0x0800이라면 Info에 있는 데이터의 프로토콜이 IP
: 만약 0x0806이라면 ARP 프로토콜
- Data (46 ~ 1500byte)
: 상위 프로토콜의 데이터가 위치한다.
: 최대 허용길이(MTU)는 1500byte이다.
: DA부터 FCS까지의 전체 길이가 64byte 이상이어야 한다는 규정을 준수한다.
- PAD
: 최소 길이 규정을 만족하지 못할 경우에는 '0'으로 채운다.
- FCS (Frame Check Sequence, 4byte)
: Preamble과 SFD를 제외한 MAC 프레임의 비트열의 에러를 검사한다. (오류 검출을 위해 사용한다.)
이더넷의 특징
1. CSMA/CD 프로토콜 사용
: 접근 제어(MAC) 프로토콜을 사용한다.
: 프레임을 전송하려는 곳에서 다른 장비가 전송 중인지 먼저 채널감지(CS, Carrier Sense)를 통해 확인한다.
: 채널을 사용 중이지 않을 때만 전송을 시도하며, 프레임 전송 중에 다른 장비가 전송하여 충돌이 생기는지 감시한다.
: 충돌이 난다면 즉시 전송을 중지한다.
2. 케이블
: 4 pair로 되어 있으며, 이더넷에서는 2 pair만 사용한다.
: 고속 이더넷에서는 4 pair 모두 사용한다.
3. 스위칭 이더넷
: 일반 허브를 스위칭 허브로 교체하여 허브에 연결된 장비가 각각 10Mbps 대역을 모두 사용한다.
: 1 Gbps 또는 10Gbps의 확장된 기가비트 이더넷을 사용한다.
네트워크 액세스 계층에서 사용하는 그 밖의 서브 네트워크
: PPP(Point-to-Point Protocol), x.25 패킷 교환망, ISDN, ATM망, 무선 전화망
인터넷 계층
최종 목적지까지의 데이터 전송을 담당한다.
인터넷 계층은 IP, ARP, RARP 프로토콜을 주로 이용한다.
IP 프로토콜 특징
: 임의의 호스트를 4byte의 IP 주소만으로 찾고 데이터그램을 전달한다.
: 비연결 방식으로 데이터그램을 전달한다.
: 데이터그램의 분실, 중복, 전달 순서 바뀜, 비트 에러 등이 발생해도 에러 확인이나 재전송 등을 하지 않는다.
: 데이터그램을 목적지로 전달만 하고 전송 결과를 확인하지 않는다.
IP 데이터그램 구조
- Version
: IP 버전 값을 표시한다. 현재는 4라는 값을 갖는다.
- IHL (Internet Header Length)
: 헤더 길이를 4byte 단위로 표시한다. 최소 값은 5이다. 왜냐하면 헤더의 최소 크기는 20byte이기 때문이다.
- Service Type
: 보통 0으로 지정한다.
- Total Length
: 헤더를 포함한 IP 데이터그램의 전체 크기를 바이트 단위로 나타낸다.
: 16비트로 표현하기 때문에 최댓값은 65535이다.
- Identification
: 상위 계층이 전송한 큰 메시지가 여러 데이터그램으로 단편화되어 전송되었을 때 수신 측에서 원래 메시지를 재구성할 때 사용하는 번호이다. 한 메시지를 구성하는 데이터그램들은 모두 같은 Identification 값을 갖는다.
- Flag
: 첫 번째 비트는 항상 0이다.
: 두 번째 비트는 단편화 금지 플래그(DF(Don't fragment)) 비트이다. 만약 DF = 0이면 데이터그램의 단편화를 허용하는 것이고, DF = 1이면 데이터그램의 단편화를 허용하지 않는 것이다.
: 세 번째 비트는 More 비트이다. 만약 More = 0이면 한 메시지의 마지막을 구성하는 데이터그램 또는 메시지가 한 데이터그램을 의미하고, More = 1이면 해당 데이터그램과 다음에 전송되는 데이터그램이 단편화되어 전송됨을 의미한다.
- Protocol
: 데이터그램에 실려 있는 데이터를 처리할 상위 계층 프로토콜을 지정한다. 네트워크 액세스 계층에서도 상위 계층 프로토콜을 16진수로 나타냈듯이 데이터그램에서도 지정할 수 있다.
: TCP = 6, UDP = 17, ICMP = 1
- TTL (Time to Live)
: 데이터그램들이 인터넷 내에서 계속 돌아다니는 것을 방지하기 위해 사용한다.
: 보통 노드를 지나는 횟수인 Hop Counter 값을 사용한다. 한 노드를 지날 때마다 1씩 감소하여 0이 되는 노드에서 이 데이터그램을 삭제한다.
: TTL 값이 너무 클 수도 있는데, 이 때는 목적지 주소에서 에러 발생 시 데이터그램이 네트워크 상에 오래 남아 트래픽이 증가하게 된다.
: 반면에 TTL 값이 너무 작을 수도 있는데, 이 때는 데이터그램이 먼 거리를 돌아가기 때문에 목적지에 도착을 못하게 된다.
: Default로 64의 값을 가지며 멀티캐스트같이 트래픽이 많이 발생할 때는 TTL을 작게 하는 방법을 추천한다.
- Header Checksum
: IP 헤더의 비트 에러 검출을 위해서 사용한다.
: 헤더를 16비트 단위 크기로 나누고 각 16비트를 숫자로 취급하여 차례로 더한 결과에 1의 보수를 취해 Header Checksum에 실어 송신한다. 수신 측 결과와 다를 시에 에러가 발생하므로 데이터그램을 삭제한다.
- Source IP Address
: 송신지의 IP 주소를 의미한다.
- Destination IP Address
: 수신지의 IP 주소를 의미한다.
- IP Options
: 옵션 선택인데 보통은 사용하지 않는다.
- Padding
: 32비트 단위로 헤더의 길이를 맞추지만 보통은 사용하지 않는다.
IP Address
- IP 주소는 4byte의 크기를 갖는다.
- IP 주소는 원래 2진수로 표현되지만 보기 쉽게 표시하기 위해서 Dotted decimal IP 주소를 이용한다. 즉, 10진수로 표시한다. ex) 192.168.x.x
- netid 필드 : 네트워크를 구분한다.
- hostid 필드 : 한 네트워크 내에서 호스트를 구분한다.
- 각 필드에서 사용하는 비트 수의 크기에 따라 4가지 클래스로 분류한다.
- 클래스는 앞 비트에 따라서 달라진다. 회사나 학교 내에서는 보통 Class C를 이용한다.
ARP(Address Resolution Protocol)
: LAN내에서 특정 IP 주소를 가지고 있는 호스트의 MAC 주소를 알아내는 프로토콜이다.
ARP 동작 과정
1. 송신자는 목적지의 IP 주소를 알고 있으나 물리 주소(MAC)를 모르기 때문에 ARP 요청 메시지를 Broadcast로 전송한다.
2. 모든 호스트와 라우터는 송신자가 보낸 ARP 요청 메시지를 받는다.
3. 송신자가 보낸 ARP 요청 메시지에서 해당되는 수신자가 물리주소를 넣어 ARP 응답 메시지를 Unicast로 전송한다.
RARP
: ARP의 역과정이다.
: 게이트웨이의 ARP 목록이나 캐시로부터 IP 주소를 알아내기 위해 사용한다.
RARP 동작 과정
1. 네트워크 관리자가 근거리 통신망의 게이트웨이 라우터 내에 물리적인 장치가 그에 상응하는 IP 주소를 지칭하도록 표를 작성한다.
2. 새로운 장치가 설정되었을 때 RARP 클라이언트 프로그램은 라우터 상의 RARP 서버에게 그 장치를 위한 IP 주소를 보내주도록 요청한다.
3. RARP 서버는 라우터 목록 내에 새로운 엔트리가 설정되었다고 가정하여 그 장치에게 IP 주소를 응답한다.
인터넷 계층 기능
1. MTU(Maximum Transmission Unit)
: 서브네트워크가 한 번에 전달할 수 있는 데이터그램의 최대 크기를 의미한다.
: 이더넷의 경우에는 MTU가 1500byte이다. 또한, PPP의 경우에는 전송매체에 따라 가변적이지만 전화선일 경우 주로 576byte를 사용한다.
: 인터넷 계층이 상위 계층으로 받은 메시지의 크기가 path MTU보다 큰 경우에 이를 여러개의 IP 데이터그램으로 단편화하여 전송한다. 수신 측에서는 단편화된 데이터그램을 재조립한다. (재조립할 때 이용하는 게 위에서 설명했던 Identification 필드)
: 만약 데이터그램이 하나라도 손실될 경우에는 수신 측에서 전체 메시지를 버린다. 또한, 재조립도 실행되지 않는다.
2. path MTU
: 종점 호스트 사이에 존재하는 서브네트워크들의 MTU중 최소 MTU를 의미한다.
: IP Header의 플래그 DF가 1이면서 IP 데이터그램의 크기가 path MTU보다 클 경우, DF = 1이면 단편화를 사용하지 않는데, 데이터그램의 크기가 MTU보다 크기때문에 중간 라우터에서 에러가 발생한다. 이 때, 송신측에게 알린다.
: 그래서 일반 데이터그램의 경우에는 DF = 0으로 설정하고 필요할 때마다 라우터에서 단편화한다.
3. 라우팅
: IP 데이터그램이 목적지 호스트까지 전달되기 위해 거쳐야 할 라우터를 정해주는 기능을 의미한다.
: 현재 우리가 인터넷을 사용할 수 있는 것도 안정적인 라우팅 동작때문이다.
전송 계층
프로세스 간의 신뢰성 있는 데이터 전송을 담당한다.
전송 계층에서 쓰이는 프로토콜은 TCP와 UDP이다.
TCP
: 장치들 사이에 신뢰성을 보장하며 연결형 서비스이다.
TCP 특징
- 연결형 서비스 제공
: 종점 호스트 사이에 1:1 연결을 제공한다. 이 과정에서 연결설정, 데이터 송수신, 연결종료 과정이 필요하다.
: 두 호스트 사이에 TCP 연결 설정이 이루어지면 두 개의 스트림이 생성되어 양방향 통신을 한다.
: 호스트1이 호스트2로 연결요청을 한 경우에도 호스트2가 호스트1에게 데이터를 전송할 수 있다.
- 신뢰성 있는 데이터 전달
: 확인응답(ACK), Checksum, 재전송, 흐름제어 등을 사용하여 신뢰성 있는 송수신을 보장한다.
확인응답(ACK)
: 상대방 TCP에게 잘 전달되었는지 확인하기 위해 사용한다.
: 데이터를 수신한 상대방은 데이터에 에러가 없고 순서에 문제가 없을 시 송신 측에 ACK를 보낸다.
: 에러 확인은 Checksum, 순서확인은 순서번호를 사용한다.
: Piggyback 기능이 있는데, 데이터를 보낼 때마다 ACK를 전송하면 불필요한 트래픽이 발생하기 때문에 수신 측은 송신 측으로부터 데이터를 받았을 때 바로 ACK을 보내는 것이 아니라 시간지연을 둔다. 지연 시간 동안 보낼 데이터가 생기면 데이터에 ACK를 포함시켜 전송한다.
Checksum
: 데이터 전송 중에 발생한 에러를 검출한다. Checksum 에러 발견 시 데이터를 버리고 ACK를 버리지 않는다. 이 에러 상황을 송신 측에 알려주지 않는다.
재전송
: 일정 시간 동안 ACK가 오지 않으면 전송했던 데이터를 재전송한다.
: 재전송을 위해서 송신 측은 타이머를 사용한다. 즉, 타이머 시간 동안 ACK가 오지 않을 때 다시 재전송한다.
: 전송 타이머 값은 RTT(Round Trip Time)에 비례하여 정해지며 횟수에도 제한을 둔다. 일정 횟수 이상 ACK가 없을 시 종점간 연결을 종료한다.
흐름 제어
: 수신측의 상황에 의한 흐름제어가 존재하는데, 상대방이 너무 많은 데이터를 보내지 못하게 하는 흐름제어가 존재한다. 또한, 수신 버퍼의 여유 크기를 고려하여 상대방이 전송할 수 있는 데이터 양을 바이트 단위로 알려준다. 수신할 수 있는 데이터 양을 Window Field(16bit)를 통해 송신 측에 알려준다.
: 송신측의 상황에 의한 흐름제어가 존재하는데, 송신 버퍼가 부족하면 write(), send() 같은 쓰기 함수가 블록된다.
- 스트림형 서비스 제공
: 송신측에서 전송된 데이터는 바이트 단위를 이용하여 차례대로 수신 측에 전달된다.
: 스트림 서비스는 송신된 데이터를 수신 측에서 차례대로 읽을 수 있게 제공되는 통신 채널 서비스이다. 수신 측에서는 송신된 데이터를 한 번에 읽거나 여러 번으로 나누어 읽을 수 있다.
세그먼트 (Segment)
: 전송 계층이 인터넷 계층으로 내려 보내는 데이터 단위를 의미한다.
세그먼트의 구성
TCP 세그먼트와 헤더 구조
- Source Port
: 송신 측의 응용 프로세스를 구분하는 포트번호를 의미한다.
- Destination Port
: 수신 측의 응용 프로세스를 구분하는 포트번호를 의미한다.
- Sequence Number Field
: 세그먼트에 실려 있는 데이터의 첫 번째 바이트의 순서번호를 기록한다.
: 수신 측에서 데이터가 정상적으로 도착하는지 확인하는데 사용한다.
- ACK(Acknowledgement) Number
: ACK 플래그가 1일 경우에만 의미있는 필드이다.
- Header Length
: 헤더의 크기를 4byte 단위로 나타낸다.
: TCP에서 옵션을 사용하지 않는 경우 TCP 헤더의 크기가 20byte이므로 5로 설정한다.
- Rsvd
: 현재는 사용되지 않는 필드이므로 0으로 설정한다.
- Code Bits
URG : Urgent Pointer가 유효한 값임을 나타낸다.
ACK : ACK Number에 들어 있는 값이 의미있는 값임을 나타낸다.
PSH : 이 데이터를 가능한 신속히 응용에 전달하도록 한다.
RST : 연결을 Reset할 때 사용한다.
SYN : TCP 연결을 시작할 때 사용한다.
FIN : TCP 연결을 종료할 때 사용한다.
- Window
: 수신 측이 현재 수신 가능한 데이터 버퍼 크기를 바이트 단위로 나타낸다.
- Checksum
pseudo 헤더 : TCP Segment 전체 + IP Header 후반부 12byte
: pseudo 헤더에 대한 에러 검출 코드이다.
- Urgent Pointer
: URG 비트가 1일 때 의미있고, 현재 세그먼트에 포함된 긴급 데이터의 마지막 위치를 가리키는 오프셋을 저장한다.
: 긴급 데이터는 Sequence Number 위치부터 시작하여 Urgent Pointer byte만큼 범위에 속한다.
TCP 연결 설정
3-way : 최초 연결 요청에 상대방이 확인하면서 다시 연결요청하고 이에 대해 처음 연결 요청을 확인하는 방법이다. 3회의 통신이 이루어져야 한다.
연결 설정 절차
1. 연결 요청 측에서 SYN 비트를 설정하고 순서번호를 랜덤 정수 X로 한 연결 요청을 상대방에게 보낸다.
2. 상대방은 응답을 위해 ACK 비트를 설정하고 ACK Number에 (X+1)을 기록하며 SYN 비트도 설정한 후 다음 자신이 사용할 랜덤 순서 번호 Y를 지정하며 연결 요청 측에 보낸다.
3. 최초 연결 요청자가 ACK(Y+1)로 응답하면 연결된다.
TCP 연결 종료
TCP 연결 종료는 TCP 응용 프로그램에서 해당 소켓에 대해 close()를 호출한 경우나 응용 프로그램이 종료된 경우에 실행된다.
연결 종료 절차
1. TCP는 상대방에게 FIN 플래그를 설정하여 전송한다. 즉, 더 이상 전송할 데이터가 없다는 것이다.
2. 이에 대해서 ACK를 받음으로써 송신 측 방향의 채널이 닫힌다. (half close)
3. FIN을 받은 측에서 자신도 FIN을 보내어 양방향 채널을 모두 종료한다.
연결 종료 절차의 TIME-WAIT 상태
: Active close를 한 호스트가 FIN을 받고 이 FIN에 대한 ACK를 보내기까지 잠시 머문 상태를 의미한다.
: TIME-WAIT를 사용하는 이유는 지금까지 사용했던 포트번호를 재사용할 수 없도록 제한하기 위해서이다.
TIME-WAIT 상태를 두는 이유
1. 연결 종료를 신청한 측(Active close)에서 ACK(L+1)까지 안전하게 전송해야 양방향 채널이 종료된다. 만약 ACK(L+1) 메시지가 사라지면 상대방(Passive close)은 FIN(L)을 전송한다. 이 때 TIME-WAIT 상태에 머물리 않았다면 FIN(L)에 대한 ACK(L+1)을 보낼 수 없다. 즉, 종료를 모두 완료하기 위해서 기다리는 시간이다.
2. 연결 종료 직후에 같은 IP 주소와 포트번호로 새로운 연결요청을 허용할 경우, 과거의 연결에 사용되었던 세그먼트가 뒤늦게 도착하는 것으로 수신할 수 있다.
2MSL
: TIME-WAIT 상태의 다른 이름이다. TIME-WAIT에서 기다리는 시간이 2*MSL(Maximum Segment Lifetime)시간이기 때문에 붙여진 이름이며, MSL은 네트워크 내에서 세그먼트가 남아있을 수 있는 최대 예상 시간을 의미한다.
: TIME-WAIT 상태에 있는 동안 과거에 전송된 세그먼트가 도착한다면 이 세그먼트는 버려지고 2MSL 타이머는 재시작한다.
: TIME-WAIT 시간 이후에 세그먼트가 도착한다면 이 세그먼트는 무시되고 송신 측으로 리넷(RST) 비트를 설정시켜 전송한다.
Active close는 TIME-WAIT를 갖는데, 왜 Passive close는 TIME-WAIT를 갖지 않을까?
: FIN(L)을 보낸 후 상대방으로부터 ACK(L+1)을 받으면 TCP 초기 상태로 돌아가기 때문이다.
UDP
: 데이터의 분실 확인, 전달 순서를 보장하지 않으며 헤더의 크기가 작고 연결 지연이 없다. 보통 간단한 데이터를 빠른 속도로 전송하고자 할 때 사용된다.
UDP 특징
- 비연결형 전송 계층 서비스를 제공한다.
- 분실 확인이나 전달 순서를 보장하지 않는다.
- 스트림을 제공하지 않고 UDP 세그먼트 단위로 송수신이 이루어진다.
- 흐름제어나 ACK 기능을 제공하지 않으므로 데이터를 전송한 후 버퍼에 남겨두지 않는다.
UDP 헤더
송신지와 수신지의 포트번호, 데이터그램의 길이, Checksum으로 이루어졌다.
'CS' 카테고리의 다른 글
[컴퓨터 구조] 컴퓨터 시스템의 구조 (0) | 2020.11.27 |
---|
댓글