출처
http://helloworld.naver.com/helloworld/textyle/47667
http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Network_Programing/Documents/IntroTCPIP
http://jkkang.net/unix/netprg/chap1/net1_2.html
http://hyeonstorage.tistory.com/287
http://mindnet.tistory.com/97
http://rhyshan.com/278
1. TCP/IP의 중요한 성질
TCP/IP (Transmission Control Protocol / Internet Protocol)
- 데이터의 순서가 바뀌지 않으며 데이터가 유실되지 않도록 가급적 빠르게 데이터를 보내려면 네트워크 프로토콜을 어떻게 설계해야 할지에 대한 고민 아래에서 설계된 것이다.
- TCP/IP가 나타난 이유는 컴퓨터간 통신을 위해서이다. TCP/IP는 가장 최근에 발명된 컴퓨터와 컴퓨터간의 지역 네트워크(LAN) 혹은 광역 네트워크(WAN)에서 원할한 통신을 가능하도록 하기 위한 통신규약(Protocol)으로 정의할 수 있다. 최초 미국방성에서 구축한 ARPANET에서 시작되었으며, 후에 미국방위통신청(DAC-Defense Communication Agency)에서 컴퓨터간 통신을 위해서 TCP/IP를 사용하도록 한 것이 그 시초가 되었다.
- TCP/IP가 인기를 구가하게 된건 인터넷의 등장이 그 결정적인 역할을 했다. 가장 인기있는 인터넷 서비스인 WWW, EMAIL, TELNET, FTP 등 대부분이 TCP/IP 기반에서 만들어졌다. TCP/IP는 TCP와 IP 2개의 프로토콜로 이루어져 있는데 통상 IP프로토콜 위에 TCP프로토콜이 놓이게 되어 이렇게 불리게 되었다.
o IP - node와 node(컴퓨터와 컴퓨터) 간의 데이터 패킷을 전송하기 위해서는 각 node에 주소를 필요로 한다. IP는 4바이트로 이루어진
o TCP - 서버와 클라이언트간에 데이터를 신뢰성있게 전달하기 위해 만들어진 연결지향 프로토콜이다.
1. Connection oriented
- 두 개의 end-point(local, remote) 사이에 연결을 먼저 맺고 데이터를 주고받는다. 여기서 'TCP 연결 식별자'는 두 end-point의 주소를 합친 것으로, <로컬 IP주소, 로컬 port번호, 리모트 IP주소, 리모트 port번호> 형태이다.
- 연결을 맺기 위해 3-way handshaking을 이용한다.
2. Bidirection byte stream
- 양방향 데이터 통신을 하고, 바이트 스트림을 사용한다.
3. In-order delevery
- 송신자(sender)가 보낸 순서대로 수신자(receiver)가 데이터를 받는다. 이를 위해서는 데이터의 순서가 필요하다. 순서를 표시하기 위해 32-bit 정수 자료형을 사용한다.
4. Reliability through ACK
- 데이터를 송신하고 수신자로부터 ACK(데이터 받았음)를 받지 않으면, 송신자 TCP가 데이터를 재전송한다. 따라서 송신자 TCP는 수신자로부터 ACK를 받지 않은 데이터를 보관(buffer unacknowledged data)한다.
5. Flow control
- 송신자는 수신자가 받을 수 있는 만큼 데이터를 전송한다. 수신자가 자신이 받을 수 있는 바이트 수(사용하지 않은 버퍼 크기, receive window)를 송신자에게 전달한다. 송신자는 수신자 receive window 가 허용하는 바이트 수 만큼 데이터를 전송한다.
6. Congestion control
- 네트워크 정체를 방지하기 위해 receive window와 별도로 congestion window를 사용하는데 이는 네트워크에 유입되는 데이터 양을 제한하기 위해서이다. Receive window와 마찬가지로 congestion window가 허용하는 바이트 수 만큼 데이터를 전송하며 여기에는 TCP Vegas, Westwood, BIC, CUBIC 등 다양한 알고리즘이 있다.Flow control과 달리 송신자가 단독으로 구현한다.
2. TCP/IP의 4 계층
TCP/IP는 OSI 7계층을 단순화하여 4계층으로 만들어서 사용한다.
1. Application Layer (Application + Presentation + Session)
- 네트워크를 사용하는 응용프로그램(FTP, Telnet, SMTP) 등으로 이루어진다.
2. Transport Layer (Transport)
- 도착을 원하는 시스템까지 데이터를 전송하기 위한 계층이다.
3. Internet Layer (Network)
- 데이터를 정의하고, 데이터의 경로를 배정하는 일(라우팅)을 담당한다. 라우팅하기 위해 IP프로토콜을 사용한다.
4. Netwrok Access Layer (Physical + Data Link)
-
3. 연결 맺기와 종료
+ 3-way handshaking를 이용한 TCP 연결
- TCP는 장치들 사이에 논리적인 접속을 establish하기 위하여 사용한다. TCP/IP프로토콜을 이용하여 통신을 하는 응용프로그램이 데이터를 전송하기 전에 먼저 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정을 의미한다.
SYN : Synchronize Sequence Numbers
ACK : Acknowledgmenet
[STEP 1]
Client는 Server에 접속을 요청하는 SYN패킷을 보낸다. 이때 Client는 SYN을 보내고 SYN/ACK 응답을 기다리는 SYN_SENT 상태가 된다.
[STEP 2]
Server는 SYN요청을 받고 Client에 요청을 수락한다는 ACK와 SYN flag가 설정된 패킷을 발송하고 Client가 다시 ACK으로 응답하기를 기다린다.
이 때 Server는 SYN_RECEIVED 상태가 된다.
[STEP 3]
Client는 Server에게 ACK를 보내고 이후로부터는 연결이 이루어지고 데이터가 오가게 된다.
Client와 Server의 상태는 ESTABLISHED가 된다.
+ 4-way handshaking를 이용한 TCP 연결 종료
- 세션을 종료하기위해 수행된다.
최초 상태는 서로 통신상태이기 때문에 ESTABLISHED 상태이다.
[STEP 1]
Client가 연결을 종료하겠다는 FIN플래그를 전송한다. Client는 FIN_WAIT_1 상태로 대기하게 된다.
[STEP 2]
FIN패킷을 받은 Server는 해당 포트를 CLOSE_WAIT으로 바꾸고 일단 확인메시지 ACK를 Client에게 보낸다. 이때 Client는 FIN_WAIT_2 상태가 된다.
그와 동시에 Server에서는 해당 포트에 연결되어 있는 Application에게 Cloase()를 요청한다.
[STEP 3]
Close()요청을 받은 Application은 종료 포르세스를 진행시켜 최종적으로 close가 되고,
Server는 FIN패킷을 Client에게 전송 후 자신은 LAST_ACK 상태가 된다.
[STEP 4]
Client는 FIN_WAIT_2상태에서 Server가 연결을 종료했다는 신호를 기다리다가 FIN패킷을 받으면,
확인했다는 ACK를 Server에게 전송하고 자신은 TIME_WAIT상태로 바꾼다. (TIME_WAIT에서 일정 시간이 지나면 CLOSED가 된다.)
최종 ACK를 받은 Server는 자신의 포트도 CLOSED 상태가 된다.
+ 비정상 종료 상황
따라서 다양한 상황에 따른 연결의 종료를 적절하게 처리하지 못하면,
FIN_WAIT_1, FIN_WAIT_2, CLOSE_WAIT 상태로 남아 계속 기다리는 상황이 올 수도 있다.
CLOSE_WAIT 상태 : Application에서 close()를 적절히 처리해주지 못하면 Server는 CLOSE_WAIT 상태로 계속 기다리게 된다. 이 상태가 많아지게 되면 Hang이 걸려 더 이상 연결을 하지 못하는 경우가 생길 수도 있다.
FIN_WAIT_1 상태 : Client가 세션 종료 요청을 했는데 ACK를 받지 못한 상태로, 서버를 찾을 수 없거나 네트워크 및 방화벽의 문제일 수도 있다.
일정 시간이 지나 Timeout이 되면 자동으로 닫힌다.
FIN_WAIT_2 상태 : 이 상태는 Client가 Server에 세션 종료를 요청 후 Server에서 요청을 접수했다고 ACK를 받았지만, 서버에서 종료를 완료했다는 FIN을 받지 못한 상태이다. 이미 양방의 통신이 이루어졌기 때문에 네트워크의 문제는 아닌 것으로 판단되며, Server에서 CLOSE를 처리하지 못하는 경우 일 수 있다.
역시 일정 시간이 지나 Timeout이 되면 자동으로 닫힌다.
따라서 이러한 문제 해결을 위해서 FIN_WAIT_1과 FIN_WAIT_2의 Timeout 시간을 적절히 조절할 필요가 있다. (default 240초)
4. TCP Control Flag (TCP 제어 플래그)
TCP헤더에는 6개의 Control Flag 필드가 있는데 이들은 논리적 TCP 연결회선 제어 및 데이터 관리를 위해 사용된다.
URG(Urgent)
긴급하게 처리해야 하는 데이터가 들어있다는 뜻.
이 플래그가 1로 set되면 순서에 상관없이 먼저 송신
ACK(Acknowledgement)
받는 사람이 보낸 사람의 sequence number에 TCP계층에서 길이 또는 데이터 양을 더한 것과 같은 ACK를 보냄.
ACK번호와 응답을 통해 보낸 패킷에 대한 손실을 판단하여 재전송하거나 다음 패킷을 전송
1로 set되면 확인번호 유효함. 0으로 set되면 확인번호 미포함.
SYN세그먼트 전송 이후 모든 세그먼트에는 항상 이 플래그가 1로 set된다.
PSH(PUSH)
대화형 트래픽에 사용. 버퍼가 채워지길 기다리지 않고 데이터를 전달.
데이터는 버퍼링 없이 바로 위의 계층이 아닌 Application계층의 application 으로 바로 전달됨
가능한 빨리 application에 데이터를 즉시 전달한다.
RST(Reset)
재설정을 하는 과정으로 양방향에서 동시에 일어나는 중단작업. 비정상적인 세션 연결을 끊는 것이다.
즉시 연결을 끊고자 할 때 사용된다.
SYN(Synchronize sequence Numbers)
세션을 설정하는데 사용되며, 초기에 sequence number를 보내게 된다. sequence number는 임의적으로 생성하여 보낸다.
FIN(Finish)
세션을 종료시키는데 사용되는 플래그.
'Studies' 카테고리의 다른 글
IPsec을 이용한 VPN이란? (0) | 2015.01.14 |
---|---|
Network 각종 프로토콜 정리 (0) | 2015.01.14 |
OSI 7 Layer Model (0) | 2015.01.14 |
laptop 에서 리눅스 설치시, 화면밝기 조절이 안될 때 (0) | 2014.08.21 |
리눅스에서 네트워크로 공유폴더 접근하기 (0) | 2014.08.20 |