본문 바로가기
코스웨어/14년 스마트컨트롤러

2014년 06월 18일 출석번호 9번 김해성 일일업무일지

by 알 수 없는 사용자 2014. 6. 18.
728x90
반응형

TCP 3 Way Handshake




연결 설정 상태 SEQ는 처음에 랜덤값이 걸린다.

클라이언트가 connect함수 호출 시 진행

데이터 송,수신을 하기 전에 서로 준비가 되었는지 묻고 답함 서로 간의 데이터를 송,수신 할 준비가 되어있다는 것을 확인

①SYN

SEQ (SEQuence)

1000 

 비트(FLAGS-비트를 구분함)

     SYN(1)          ACK(0)      

ACK 

1. SYN 세그먼트

클라이언트가 SYN 플래그 = 1로 설정하고, 초기 순서번호(ISN)을 랜덤하게 선택한 후

서버로 전송 (순서번호 초기화 목적) 확인응답 번호,윈도우 크기 필드 미정의됨. 

데이터 미 전송하지만, 하나의 순서번호는 소비함. SYN-SENT TCP상태로 전이.


 

②ACK + SYN

ACK 

1001 

 비트(FLAGS-비트를 구분함)

     SYN(1)          ACK(1)      

SEQ (SEQuence)

2000 

 

 

2. SYN+ACK 세그먼트

  서버에서 초기 순서번호(ISN)을 랜덤하게 선택하고 클라이언트로 전송 ACK 플래그 = 1로 

설정하고, 클라이언트로부터 수신을 기대하는 다음 순서번호를 전송 (확인응답).

윈도우 크기 필드 정의됨. 데이터 미 전송하지만, 하나의 순서번호는 소비함.

서버는 LISTEN → RECEIVED-SYN TCP상태로 전이 (절반 개방,Half Open : 75초 대기)


 

③ACK

SEQ (SEQuence)

1001 

 비트(FLAGS-비트를 구분함)

     SYN(0)          ACK(1)      

ACK 

2001 


 

 

3. ACK 세그먼트

  단순히 ACK 전송 만을 위함. 순서번호는 세그먼트 2(SYN+ACK 세그먼트)의 

확인응답번호를 그대로 복사 사용. 일반적으로, 데이터 미 전송하며, 어떠한 순서번호도 

소비하지 않음. 양단 모두 ESTABLISHED TCP상태로 들어감.




TCP Four-way handshaking


연결 종료

클라이언트나 서버가 close함수 호출 시 진행

종료해도 되냐고 물어보고 난 후 종료 할 준비가 되었다고 하면 ACK를 전송해서 종료

만약 종료할 상황이 아니면 남아있는 데이터를 전송하고 종료할 준비가 되었다고 함.

close는 클라이언트 서버와 관계 없음.


①FIN

SEQ (SEQuence) 

1000 

ACK

0

 비트(FLAGS-비트를 구분함)

     FIN(1)          ACK(0)     

 

1. 클라이언트 TCP는 첫번째 세그먼트로서 FIN 세그먼트를 전송한다..


 ②ACK

SEQ (SEQuence) 

 5000 

ACK

1001

 비트(FLAGS-비트를 구분함)

     FIN(0)          ACK(1)


 

2. 서버 TCP는 클라이언트로부터의 FIN세그먼트의 수신을 확인하기 위하여 두 번째 세그먼트인 ACK 세그먼트를 전송한다이 세그먼트에서 TCP FIN 세그먼트로부터 수신한 순서 번호에 1을 더한 값을 확인응답 번호로서 사용한다

 

③FIN

SEQ (SEQuence) 

5001 

ACK

1001 

 비트(FLAGS-비트를 구분함)

FIN(1)          ACK(0)

 

3. 서버 TCP는 서버-클라이언트 방향으로서 데이터 전송을 계속할 수 있다.만일 더 이상 보낼 데이터가 없으면서버 TCP는 세 번째 세그먼트를 전송한다이 세그먼트는 FIN 세그먼트 이다.

 

④ACK

SEQ (SEQuence) 

1001 

 ACK

     5002      

 비트(FLAGS-비트를 구분함)

FIN(0)          ACK(1)


4. 클라이언트 TCP TCP서버로부터의FIN 세그먼트 수신을 확인하기 위하여 네 번째 세그먼트인 ACK 세그먼트를 전송한다이 세그먼트에는 서버로부터의 FIN 세그먼트로부터 수신된 순서 번호에 1을 더한 값으로 설정되는 확인응답 번호가 포함된다.

연결 종료 절차는 클라이언트로부터 시작한다클라이언트 프로그램은 자신이 TCP에게 데이터 전송이 종료되었고 따라서 연결을 종료하고자 한다는 것을 알린다이것을 능동 종료 요구라고 한다.

능동 종료 요구를 수신한 후에클라이언트 TCP는 클라이언트-서버 방향의 연결을 종료한다그러나 다른 방향으로서의 통신은 여전히 개방되어 있다.

서버 프로그램이 서버-클라이언트 방향으로의 데이터 전송을 끝마치게 되면서버는 서버-클라이언트 방향의 연결 해지를 자신의 TCP에게 요구할 수 있다. (수동 종료)

이 연결 종료를 4-단계 핸드쉐이킹(four-way handshaking)라고 한다.

 




멀티 프로세스 생성하기


메모리에 들어가서 실행중에 있는 프로그램을 프로세스라 한다. 

프로그램을 실행하려면 메모리에 있어야 한다.

PID(Process ID) : 프로세스마다 고유 번호가 붙는다.

      윈도우나 리눅스 등에서 확인할 수 있다.

 

이렇게 같은 프로그램이 돌아가도 PID는 틀리다는 것을 확인 할 수 있다.


 

 

fork 함수 : 현재 프로세스와 동일한 프로세스를 복제하여 생성한다.

fork에 의해 생성되는 새로운 프로세스를 자식 프로세스라 하며,

fork를 호출한 프로세스를 부모 프로세스라 한다.

기능

자식 프로세스를 생성한다.

기본형

pid_t fork(void);

반환값

성공 : 

부모 프로세스 : 자식 프로세스의 프로세스 ID

자식 프로세스 : 0

실패 : -1

헤더 파일

<sys/types.h>

<unistd.h>

 

fork함수

fork에 의해 반환되는 값

 


 


fork 부모 프로세스가 자식 프로세스에 클론 됨.

fork.c


fork가 호출되어서 return 되는 시점에 -1과 비교되기 직전에 return 되면 자식 프로세스 하나가 

생성되어서 2개가 되는 것이다. 둘 다 똑같이 존재하며 둘 다 -1과 비교를 하고 두 개가 같이

pritnf가 실행되어 출력되고 종료된다. 하지만 이러면 무엇이 부모 프로세스인지 무엇이

자식 프로세스인지 분간이 어렵다. 원본과 완전히 똑같이 복사되기 때문이다.



fork 부모 프로세스와 자식 프로세스 구분 방법

fork1.c



pid에 fork()가 호출된 함수의 반환값을 집어 넣으면, 자식 프로세스는 반환값이 0이고

부모는 0과 -1을 제외한 숫자가 생성된다. 이렇게 부모 프로세스와 자식 프로세스를 구분할 수 있다.

 


 


getpid, getppid 함수 : getpid는 자신의 프로세스 ID를 반환하는 함수

getppid는 부모 프로세스의 프로세스 ID를 반환하는 함수.

기능

getpid는 자신의 프로세스 ID, getppid는 부모 프로세스의 프로세스 ID를 얻는다.

기본형

pid_t getpid(void);

pid_t getppid(void);

반환값

성공 : 프로세스 ID

실패 : 발생하지 않음

헤더 파일

<unistd.h>

 

 

getpid 

getpid.c

pid에 fork함수의 반환값을 저장하고, 0이 아니면 getpid는 부모 프로세스의 pid를 가진다. 그리고

현재 pid는 fork의 반환값이므로 새롭게 생성된 자식 프로세스의 pid를 가지고 있다.

pid가 0이 아니라면, getpid는 자식 프로세스의 pid이고, getppid는 부모 프로세스의 pid를 가진다.

 

 


 

vfork 함수 : fork와 같이 새로운 프로세스를 생성하며, 반환하는 값도 동일하다.

 다른 점은 자식 프로세스가 exit나 exec를 호출할 때까지 부모 프로세스는

 실행되지 않고 기다린다.

기능

자식 프로세스를 생성하고 부모 프로세스는 기다린다.

기본형

pid_t vfork(void);

반환값

성공 : 부모 프로세스 : 자식 프로세스의 프로세스 ID

   자식 프로세스 : 0

실패 : -1

헤더 파일

<sys/types.h>

<unistd.h>


 

 

 

 


 

 

 

 

 

vfork.c 

vfork.c

위의 소스와 비슷하지만 vfork는 자식 프로세스가 끝나고 나서 실행되므로

자식 프로세스의 출력문이 먼저 출력되고, 부모 프로세스의 출력문은 자식 프로세스가 종료되면,

실행되어 출력이 완료된다. 


 


나름 준비해봤슴다~부족한거 있음 집어 주시고요~

월드컵이네요~오늘 러시아랑 비겼으니 알제리랑 이기고~벨기에한테 지면 16강은 진출하겠네요

공부도 열심히하고 응원도 열심히 합시다~월드컵은 치맥과 함께~ 치멘~
 




 

728x90